Browse Source

AMBARI-18934 - Management packs should be able to link grafana dashboards and service metrics for custom services

Tim Thorpe 8 năm trước cách đây
mục cha
commit
93fcf515f4
20 tập tin đã thay đổi với 586 bổ sung70 xóa
  1. 2 0
      ambari-server/pom.xml
  2. 8 1
      ambari-server/src/main/python/ambari_server/serverConfiguration.py
  3. 88 17
      ambari-server/src/main/python/ambari_server/setupMpacks.py
  4. 165 52
      ambari-server/src/test/python/TestMpacks.py
  5. 270 0
      ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/grafana-dashboards/grafana-hdfs-users.json
  6. 7 0
      ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/STORM.txt
  7. 1 0
      ambari-server/src/test/python/uninstall/common-services/SERVICEA
  8. 1 0
      ambari-server/src/test/python/uninstall/common-services/SERVICEB
  9. 1 0
      ambari-server/src/test/python/uninstall/dashboards/SERVICEA
  10. 1 0
      ambari-server/src/test/python/uninstall/dashboards/SERVICEB
  11. 17 0
      ambari-server/src/test/python/uninstall/dashboards/files/README.txt
  12. 1 0
      ambari-server/src/test/python/uninstall/dashboards/files/STORM.txt
  13. 1 0
      ambari-server/src/test/python/uninstall/dashboards/files/metainfo.xml
  14. 1 0
      ambari-server/src/test/python/uninstall/extensions/SERVICEA
  15. 1 0
      ambari-server/src/test/python/uninstall/extensions/SERVICEB
  16. 1 0
      ambari-server/src/test/python/uninstall/stacks/2.0/SERVICEA
  17. 1 0
      ambari-server/src/test/python/uninstall/stacks/2.0/SERVICEB
  18. 17 0
      ambari-server/src/test/python/uninstall/stacks/2.0/files/README.txt
  19. 1 0
      ambari-server/src/test/python/uninstall/stacks/2.0/files/metainfo1.xml
  20. 1 0
      ambari-server/src/test/python/uninstall/stacks/2.0/files/metainfo2.xml

+ 2 - 0
ambari-server/pom.xml

@@ -272,6 +272,8 @@
             <exclude>src/test/resources/users.ldif</exclude>
             <exclude>src/test/resources/mpacks_replay.log</exclude>
             <exclude>src/test/python/stacks/2.5/HIVE/*.txt</exclude>
+            <exclude>src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/STORM.txt</exclude>
+            <exclude>src/test/python/uninstall/dashboards/files/STORM.txt</exclude>
             <exclude>src/main/resources/hive-schema-0.10.0.oracle.sql</exclude>
             <exclude>src/main/resources/hive-schema-0.12.0.oracle.sql</exclude>
             <exclude>src/main/resources/db/serial</exclude>

+ 8 - 1
ambari-server/src/main/python/ambari_server/serverConfiguration.py

@@ -186,6 +186,7 @@ SETUP_OR_UPGRADE_MSG = "- If this is a new setup, then run the \"ambari-server s
 DEFAULT_DB_NAME = "ambari"
 
 SECURITY_KEYS_DIR = "security.server.keys_dir"
+DASHBOARD_PATH_PROPERTY = 'dashboards.path'
 EXTENSION_PATH_PROPERTY = 'extensions.path'
 COMMON_SERVICES_PATH_PROPERTY = 'common.services.path'
 MPACKS_STAGING_PATH_PROPERTY = 'mpacks.staging.path'
@@ -1437,7 +1438,13 @@ def get_mpacks_staging_location(properties):
 # Dashboard location
 #
 def get_dashboard_location(properties):
-  dashboard_location = configDefaults.DASHBOARD_LOCATION_DEFAULT
+  try:
+    dashboard_location = properties[DASHBOARD_PATH_PROPERTY]
+  except KeyError:
+    dashboard_location = configDefaults.DASHBOARD_LOCATION_DEFAULT
+
+  if not dashboard_location:
+    dashboard_location = configDefaults.DASHBOARD_LOCATION_DEFAULT
   return dashboard_location
 
 #

+ 88 - 17
ambari-server/src/main/python/ambari_server/setupMpacks.py

@@ -32,7 +32,7 @@ from ambari_commons.logging_utils import print_info_msg, print_error_msg, print_
 from ambari_commons.os_utils import copy_file, run_os_command
 from ambari_server.serverConfiguration import get_ambari_properties, get_ambari_version, get_stack_location, \
   get_common_services_location, get_mpacks_staging_location, get_server_temp_location, get_extension_location, \
-  get_java_exe_path, read_ambari_user, parse_properties_file, JDBC_DATABASE_PROPERTY
+  get_java_exe_path, read_ambari_user, parse_properties_file, JDBC_DATABASE_PROPERTY, get_dashboard_location
 from ambari_server.setupSecurity import ensure_can_start_under_current_user, generate_env
 from ambari_server.setupActions import INSTALL_MPACK_ACTION, UPGRADE_MPACK_ACTION
 from ambari_server.userInput import get_YN_input
@@ -50,6 +50,12 @@ logger = logging.getLogger(__name__)
 
 MPACKS_REPLAY_LOG_FILENAME = "mpacks_replay.log"
 MPACKS_CACHE_DIRNAME = "cache"
+SERVICES_DIRNAME = "services"
+DASHBOARDS_DIRNAME = "dashboards"
+GRAFANA_DASHBOARDS_DIRNAME = "grafana-dashboards"
+SERVICE_METRICS_DIRNAME = "service-metrics"
+METRICS_EXTENSION = ".txt"
+
 STACK_DEFINITIONS_RESOURCE_NAME = "stack-definitions"
 EXTENSION_DEFINITIONS_RESOURCE_NAME = "extension-definitions"
 SERVICE_DEFINITIONS_RESOURCE_NAME = "service-definitions"
@@ -187,8 +193,9 @@ def get_mpack_properties():
   extension_location = get_extension_location(properties)
   service_definitions_location = get_common_services_location(properties)
   mpacks_staging_location = get_mpacks_staging_location(properties)
+  dashboard_location = get_dashboard_location(properties)
   ambari_version = get_ambari_version(properties)
-  return stack_location, extension_location, service_definitions_location, mpacks_staging_location
+  return stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location
 
 def _get_mpack_name_version(mpack_path):
   """
@@ -225,22 +232,35 @@ def create_symlink(src_dir, dest_dir, file_name, force=False):
   """
   src_path = os.path.join(src_dir, file_name)
   dest_link = os.path.join(dest_dir, file_name)
+  create_symlink_using_path(src_path, dest_link, force)
+
+def create_symlink_using_path(src_path, dest_link, force=False):
+  """
+  Helper function to create symbolic link (dest_link -> src_path)
+  :param src_path: Source path
+  :param dest_link: Destination link
+  :param force: Remove existing symlink
+  """
   if force and os.path.islink(dest_link):
     sudo.unlink(dest_link)
   sudo.symlink(src_path, dest_link)
   print_info_msg("Symlink: " + dest_link)
 
-def remove_symlinks(stack_location, service_definitions_location, staged_mpack_dir):
+def remove_symlinks(stack_location, extension_location, service_definitions_location, dashboard_location, staged_mpack_dir):
   """
   Helper function to remove all symbolic links pointed to a management pack
   :param stack_location: Path to stacks folder
                          (/var/lib/ambari-server/resources/stacks)
+  :param extension_location: Path to extensions folder
+                             (/var/lib/ambari-server/resources/extension)
   :param service_definitions_location: Path to service_definitions folder
                                       (/var/lib/ambari-server/resources/common-services)
+  :param dashboard_location: Path to the custom service dashboard folder
+                             (/var/lib/ambari-server/resources/dashboards)
   :param staged_mpack_dir: Path to management pack staging location
                            (/var/lib/ambari-server/resources/mpacks/mpack_name-mpack_version)
   """
-  for location in [stack_location, service_definitions_location]:
+  for location in [stack_location, extension_location, service_definitions_location, dashboard_location]:
     for root, dirs, files in os.walk(location):
       for name in files:
         file = os.path.join(root, name)
@@ -292,7 +312,7 @@ def validate_purge(options, purge_list, mpack_dir, mpack_metadata, replay_mode=F
   :param replay_mode: Flag to indicate if purging in replay mode
   """
   # Get ambari mpacks config properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
 
   if not purge_list:
     return
@@ -338,7 +358,7 @@ def purge_stacks_and_mpacks(purge_list, replay_mode=False):
   :param replay_mode: Flag to indicate if purging in replay mode
   """
   # Get ambari mpacks config properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
 
   print_info_msg("Purging existing stack definitions and management packs")
 
@@ -376,7 +396,7 @@ def process_stack_definitions_artifact(artifact, artifact_source_dir, options):
   :param options: Command line options
   """
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   for file in sorted(os.listdir(artifact_source_dir)):
     if os.path.isfile(os.path.join(artifact_source_dir, file)):
       # Example: /var/lib/ambari-server/resources/stacks/stack_advisor.py
@@ -395,16 +415,53 @@ def process_stack_definitions_artifact(artifact, artifact_source_dir, options):
           if not os.path.exists(dest_stack_version_dir):
             sudo.makedir(dest_stack_version_dir, 0755)
           for file in sorted(os.listdir(src_stack_version_dir)):
-            if file == "services":
+            if file == SERVICES_DIRNAME:
               src_stack_services_dir = os.path.join(src_stack_version_dir, file)
               dest_stack_services_dir = os.path.join(dest_stack_version_dir, file)
               if not os.path.exists(dest_stack_services_dir):
                 sudo.makedir(dest_stack_services_dir, 0755)
               for file in sorted(os.listdir(src_stack_services_dir)):
                 create_symlink(src_stack_services_dir, dest_stack_services_dir, file, options.force)
+                src_service_dir = os.path.join(src_stack_services_dir, file)
+                create_dashboard_symlinks(src_service_dir, file, dashboard_location, options)
             else:
               create_symlink(src_stack_version_dir, dest_stack_version_dir, file, options.force)
 
+def create_dashboard_symlinks(src_service_dir, service_name, dashboard_location, options):
+  """
+  If there is a dashboards directory under the src_service_dir,
+  create symlinks under the dashboard_location for the grafana_dashboards
+  and the service-metrics
+  :param src_service_dir: Location of the service directory in the management pack
+  :param service_name: Name of the service directory
+  :param dashboard_location: Location of the dashboards directory in ambari-server/resources
+  :param options: Command line options
+  """
+  src_dashboards_dir = os.path.join(src_service_dir, DASHBOARDS_DIRNAME)
+  if not os.path.exists(src_dashboards_dir):
+    return
+
+  src_grafana_dashboards_dir = os.path.join(src_dashboards_dir, GRAFANA_DASHBOARDS_DIRNAME)
+  src_metrics_dir = os.path.join(src_dashboards_dir, SERVICE_METRICS_DIRNAME)
+  if os.path.exists(src_grafana_dashboards_dir):
+    dest_grafana_dashboards_dir = os.path.join(dashboard_location, GRAFANA_DASHBOARDS_DIRNAME)
+    dest_service_dashboards_link = os.path.join(dest_grafana_dashboards_dir, service_name)
+    if os.path.exists(dest_service_dashboards_link):
+      message = "Grafana dashboards already exist for service {0}.".format(service_name)
+      print_warning_msg(message)
+    else:
+      create_symlink_using_path(src_grafana_dashboards_dir, dest_service_dashboards_link, options.force)
+
+  service_metrics_filename = service_name + METRICS_EXTENSION
+  src_metrics_file = os.path.join(src_metrics_dir, service_metrics_filename)
+  if os.path.exists(src_metrics_file):
+    dest_metrics_dir = os.path.join(dashboard_location, SERVICE_METRICS_DIRNAME)
+    if os.path.exists(os.path.join(dest_metrics_dir, service_metrics_filename)):
+      message = "Service metrics already exist for service {0}.".format(service_name)
+      print_warning_msg(message)
+    else:
+      create_symlink(src_metrics_dir, dest_metrics_dir, service_metrics_filename, options.force)
+
 def process_extension_definitions_artifact(artifact, artifact_source_dir, options):
   """
   Process extension-definitions artifacts
@@ -417,7 +474,7 @@ def process_extension_definitions_artifact(artifact, artifact_source_dir, option
   :param options: Command line options
   """
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   if not os.path.exists(extension_location):
     sudo.makedir(extension_location, 0755)
   for file in sorted(os.listdir(artifact_source_dir)):
@@ -431,6 +488,12 @@ def process_extension_definitions_artifact(artifact, artifact_source_dir, option
         sudo.makedir(dest_extension_dir, 0755)
       for file in sorted(os.listdir(src_extension_dir)):
         create_symlink(src_extension_dir, dest_extension_dir, file, options.force)
+        src_extension_version_dir = os.path.join(src_extension_dir, file)
+        src_services_dir = os.path.join(src_extension_version_dir, SERVICES_DIRNAME)
+        if os.path.exists(src_services_dir):
+          for file in sorted(os.listdir(src_services_dir)):
+            src_service_dir = os.path.join(src_services_dir, file)
+            create_dashboard_symlinks(src_service_dir, file, dashboard_location, options)
 
 def process_service_definitions_artifact(artifact, artifact_source_dir, options):
   """
@@ -440,14 +503,17 @@ def process_service_definitions_artifact(artifact, artifact_source_dir, options)
   :param options: Command line options
   """
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   for file in sorted(os.listdir(artifact_source_dir)):
+    service_name = file
     src_service_definitions_dir = os.path.join(artifact_source_dir, file)
     dest_service_definitions_dir = os.path.join(service_definitions_location, file)
     if not os.path.exists(dest_service_definitions_dir):
       sudo.makedir(dest_service_definitions_dir, 0755)
     for file in sorted(os.listdir(src_service_definitions_dir)):
       create_symlink(src_service_definitions_dir, dest_service_definitions_dir, file, options.force)
+      src_service_version_dir = os.path.join(src_service_definitions_dir, file)
+      create_dashboard_symlinks(src_service_version_dir, service_name, dashboard_location, options)
 
 def process_stack_addon_service_definitions_artifact(artifact, artifact_source_dir, options):
   """
@@ -457,7 +523,7 @@ def process_stack_addon_service_definitions_artifact(artifact, artifact_source_d
   :param options: Command line options
   """
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   service_versions_map = None
   if "service_versions_map" in artifact:
     service_versions_map = artifact.service_versions_map
@@ -477,7 +543,7 @@ def process_stack_addon_service_definitions_artifact(artifact, artifact_source_d
             stack_version = applicable_stack.stack_version
             dest_stack_path = os.path.join(stack_location, stack_name)
             dest_stack_version_path = os.path.join(dest_stack_path, stack_version)
-            dest_stack_services_path = os.path.join(dest_stack_version_path, "services")
+            dest_stack_services_path = os.path.join(dest_stack_version_path, SERVICES_DIRNAME)
             dest_link = os.path.join(dest_stack_services_path, service_name)
             if os.path.exists(dest_stack_path) and os.path.exists(dest_stack_version_path):
               if not os.path.exists(dest_stack_services_path):
@@ -485,6 +551,7 @@ def process_stack_addon_service_definitions_artifact(artifact, artifact_source_d
               if options.force and os.path.islink(dest_link):
                 sudo.unlink(dest_link)
               sudo.symlink(source_service_version_path, dest_link)
+              create_dashboard_symlinks(source_service_version_path, service_name, dashboard_location, options)
 
 def search_mpacks(mpack_name, max_mpack_version=None):
   """
@@ -495,7 +562,7 @@ def search_mpacks(mpack_name, max_mpack_version=None):
   :return: List of management pack
   """
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   results = []
   if os.path.exists(mpacks_staging_location) and os.path.isdir(mpacks_staging_location):
     staged_mpack_dirs = sorted(os.listdir(mpacks_staging_location))
@@ -534,7 +601,7 @@ def uninstall_mpack(mpack_name, mpack_version):
   """
   print_info_msg("Uninstalling management pack {0}-{1}".format(mpack_name, mpack_version))
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   found = False
   if os.path.exists(mpacks_staging_location) and os.path.isdir(mpacks_staging_location):
     staged_mpack_dirs = sorted(os.listdir(mpacks_staging_location))
@@ -553,7 +620,7 @@ def uninstall_mpack(mpack_name, mpack_version):
         if mpack_name == staged_mpack_name and compare_versions(staged_mpack_version, mpack_version, format=True) == 0:
           print_info_msg("Removing management pack staging location {0}".format(staged_mpack_dir))
           sudo.rmtree(staged_mpack_dir)
-          remove_symlinks(stack_location, service_definitions_location, staged_mpack_dir)
+          remove_symlinks(stack_location, extension_location, service_definitions_location, dashboard_location, staged_mpack_dir)
           found = True
           break
   if not found:
@@ -652,7 +719,7 @@ def _install_mpack(options, replay_mode=False, is_upgrade=False):
     purge_stacks_and_mpacks(purge_resources, replay_mode)
 
   # Get ambari mpack properties
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   mpacks_cache_location = os.path.join(mpacks_staging_location, MPACKS_CACHE_DIRNAME)
   # Create directories
   if not os.path.exists(stack_location):
@@ -665,6 +732,10 @@ def _install_mpack(options, replay_mode=False, is_upgrade=False):
     sudo.makedir(mpacks_staging_location, 0755)
   if not os.path.exists(mpacks_cache_location):
     sudo.makedir(mpacks_cache_location, 0755)
+  if not os.path.exists(dashboard_location):
+    sudo.makedir(dashboard_location, 0755)
+    sudo.makedir(os.path.join(dashboard_location, GRAFANA_DASHBOARDS_DIRNAME), 0755)
+    sudo.makedir(os.path.join(dashboard_location, SERVICE_METRICS_DIRNAME), 0755)
 
   # Stage management pack (Stage at /var/lib/ambari-server/resources/mpacks/mpack_name-mpack_version)
   mpack_name = mpack_metadata.name
@@ -743,7 +814,7 @@ def get_replay_log_file():
   Helper function to get mpack replay log file path
   :return: mpack replay log file path
   """
-  stack_location, extension_location, service_definitions_location, mpacks_staging_location = get_mpack_properties()
+  stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties()
   replay_log_file = os.path.join(mpacks_staging_location, MPACKS_REPLAY_LOG_FILENAME)
   return replay_log_file
 

+ 165 - 52
ambari-server/src/test/python/TestMpacks.py

@@ -48,9 +48,10 @@ with patch.object(platform, "linux_distribution", return_value = MagicMock(retur
                 serverConfiguration.search_file = _search_file
 
 from ambari_server.setupMpacks import install_mpack, upgrade_mpack, replay_mpack_logs, \
-  purge_stacks_and_mpacks, validate_purge, read_mpack_metadata, \
+  purge_stacks_and_mpacks, validate_purge, read_mpack_metadata, uninstall_mpack, \
   STACK_DEFINITIONS_RESOURCE_NAME, EXTENSION_DEFINITIONS_RESOURCE_NAME, \
-  SERVICE_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME
+  SERVICE_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME, GRAFANA_DASHBOARDS_DIRNAME, \
+  DASHBOARDS_DIRNAME, SERVICE_METRICS_DIRNAME
 
 with patch.object(os, "geteuid", new=MagicMock(return_value=0)):
   from resource_management.core import sudo
@@ -63,6 +64,7 @@ def get_configs():
     serverConfiguration.STACK_LOCATION_KEY : "/var/lib/ambari-server/resources/stacks",
     serverConfiguration.COMMON_SERVICES_PATH_PROPERTY : "/var/lib/ambari-server/resources/common-services",
     serverConfiguration.EXTENSION_PATH_PROPERTY : "/var/lib/ambari-server/resources/extensions",
+    serverConfiguration.DASHBOARD_PATH_PROPERTY : "/var/lib/ambari-server/resources/dashboards",
     serverConfiguration.MPACKS_STAGING_PATH_PROPERTY : mpacks_directory,
     serverConfiguration.SERVER_TMP_DIR_PROPERTY : "/tmp",
     serverConfiguration.JDBC_DATABASE_PROPERTY: "postgres"
@@ -71,6 +73,7 @@ def get_configs():
 
 configs = get_configs()
 
+
 class TestMpacks(TestCase):
 
   def test_install_mpack_with_no_mpack_path(self):
@@ -272,20 +275,30 @@ class TestMpacks(TestCase):
                             call('/var/lib/ambari-server/resources/common-services'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/cache'),
+                            call('/var/lib/ambari-server/resources/dashboards'),
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0'),
                             call('/var/lib/ambari-server/resources/common-services/SERVICEA'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/common-services/SERVICEA/1.0/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/common-services/SERVICEA/2.0/dashboards'),
                             call('/var/lib/ambari-server/resources/common-services/SERVICEB'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/common-services/SERVICEB/1.0.0/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/common-services/SERVICEB/2.0.0/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/services/SERVICEA/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.1'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.1/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.1/services/SERVICEA/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/2.0/services/SERVICEA/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/2.0/services/SERVICEB/dashboards'),
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py')]
     """
-    os_path_exists_mock.side_effect = [True, True, True, False, True, False, False, False,
+    os_path_exists_mock.side_effect = [True, True, True, False, True, False, False, False, False,
                                        False, False, False, False, False, False,
+                                       False, False, False, False, False, False, False, False,
                                        False, False, False, False, True]
     get_ambari_properties_mock.return_value = configs
     shutil_move_mock.return_value = True
@@ -296,6 +309,7 @@ class TestMpacks(TestCase):
     common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
     extensions_directory = configs[serverConfiguration.EXTENSION_PATH_PROPERTY]
     mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
+    dashboards_directory = serverConfiguration.get_dashboard_location(configs)
     mpacks_staging_directory = os.path.join(mpacks_directory, "mystack-ambari-mpack-1.0.0.0")
 
     run_os_command_calls = [
@@ -314,6 +328,9 @@ class TestMpacks(TestCase):
       call(common_services_directory),
       call(mpacks_directory),
       call(mpacks_directory + '/cache'),
+      call(dashboards_directory),
+      call(os.path.join(dashboards_directory, GRAFANA_DASHBOARDS_DIRNAME)),
+      call(os.path.join(dashboards_directory, SERVICE_METRICS_DIRNAME)),
       call(os.path.join(common_services_directory, "SERVICEA")),
       call(os.path.join(common_services_directory, "SERVICEB")),
       call(os.path.join(stacks_directory, "MYSTACK")),
@@ -385,7 +402,19 @@ class TestMpacks(TestCase):
     download_mpack_mock.return_value = "/tmp/myextension.tar.gz"
     expand_mpack_mock.return_value = "mpacks/myextension-ambari-mpack-1.0.0.0"
     get_ambari_version_mock.return_value = "2.4.0.0"
-    """
+
+    os_path_exists_mock.side_effect = [True, True, True, False, True, False, False, False,
+                                       False, True, False, False, False]
+    get_ambari_properties_mock.return_value = configs
+    shutil_move_mock.return_value = True
+
+    install_mpack(options)
+
+    extensions_directory = configs[serverConfiguration.EXTENSION_PATH_PROPERTY]
+    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
+    mpacks_staging_directory = os.path.join(mpacks_directory, "myextension-ambari-mpack-1.0.0.0")
+    dashboards_directory = serverConfiguration.get_dashboard_location(configs)
+
     os_path_exists_calls = [call('/tmp/myextension.tar.gz'),
                             call('mpacks/myextension-ambari-mpack-1.0.0.0/mpack.json'),
                             call('/var/lib/ambari-server/resources/stacks'),
@@ -393,24 +422,20 @@ class TestMpacks(TestCase):
                             call('/var/lib/ambari-server/resources/common-services'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/cache'),
+                            call('/var/lib/ambari-server/resources/dashboards'),
                             call(mpacks_directory + '/myextension-ambari-mpack-1.0.0.0'),
                             call('/var/lib/ambari-server/resources/extensions'),
-                            call('/var/lib/ambari-server/resources/extensions/MYEXTENSION')]
-    """
-    os_path_exists_mock.side_effect = [True, True, True, False, True, False, False,
-                                       False, True, False]
-    get_ambari_properties_mock.return_value = configs
-    shutil_move_mock.return_value = True
+                            call('/var/lib/ambari-server/resources/extensions/MYEXTENSION'),
+                            call(mpacks_directory + '/myextension-ambari-mpack-1.0.0.0/extensions/MYEXTENSION/1.0/services'),
+                            call(mpacks_directory + '/myextension-ambari-mpack-1.0.0.0/extensions/MYEXTENSION/1.1/services')]
 
-    install_mpack(options)
-
-    extensions_directory = configs[serverConfiguration.EXTENSION_PATH_PROPERTY]
-    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
-    mpacks_staging_directory = os.path.join(mpacks_directory, "myextension-ambari-mpack-1.0.0.0")
     os_mkdir_calls = [
       call(extensions_directory),
       call(mpacks_directory),
       call(mpacks_directory + '/cache'),
+      call(dashboards_directory),
+      call(os.path.join(dashboards_directory, GRAFANA_DASHBOARDS_DIRNAME)),
+      call(os.path.join(dashboards_directory, SERVICE_METRICS_DIRNAME)),
       call(os.path.join(extensions_directory, "MYEXTENSION"))
     ]
     create_symlink_calls = [
@@ -422,6 +447,7 @@ class TestMpacks(TestCase):
            "1.1", None)
     ]
 
+    os_path_exists_mock.assert_has_calls(os_path_exists_calls)
     self.assertFalse(purge_stacks_and_mpacks_mock.called)
     os_mkdir_mock.assert_has_calls(os_mkdir_calls)
     create_symlink_mock.assert_has_calls(create_symlink_calls)
@@ -449,7 +475,24 @@ class TestMpacks(TestCase):
     download_mpack_mock.return_value = "/tmp/myservice.tar.gz"
     expand_mpack_mock.return_value = "mpacks/myservice-ambari-mpack-1.0.0.0"
     get_ambari_version_mock.return_value = "2.4.0.0"
-    """
+
+    os_path_exists_mock.side_effect = [True, True, True, True, True, True,
+                                       True, True, False, False, False, False,
+                                       True, True, True, False, True, True,
+                                       True, False]
+
+    get_ambari_properties_mock.return_value = configs
+    shutil_move_mock.return_value = True
+    os_path_isdir_mock.return_value = True
+
+    install_mpack(options)
+
+    stacks_directory = configs[serverConfiguration.STACK_LOCATION_KEY]
+    common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
+    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
+    mpacks_staging_directory = os.path.join(mpacks_directory, "myservice-ambari-mpack-1.0.0.0")
+    dashboards_directory = serverConfiguration.get_dashboard_location(configs)
+
     os_path_exists_calls = [call('/tmp/myservice.tar.gz'),
                             call('mpacks/myservice-ambari-mpack-1.0.0.0/mpack.json'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0'),
@@ -458,31 +501,23 @@ class TestMpacks(TestCase):
                             call('/var/lib/ambari-server/resources/common-services'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/cache'),
+                            call('/var/lib/ambari-server/resources/dashboards'),
                             call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0'),
                             call('/var/lib/ambari-server/resources/common-services/MYSERVICE'),
+                            call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0/common-services/MYSERVICE/1.0.0/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0/services'),
+                            call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0/custom-services/MYSERVICE/1.0.0/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0'),
-                            call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0/services')]
-    """
-    os_path_exists_mock.side_effect = [True, True, True, True, True, True,
-                                       True, True, False, False, True,
-                                       True, True, True, True, True]
-
-    get_ambari_properties_mock.return_value = configs
-    shutil_move_mock.return_value = True
-    os_path_isdir_mock.return_value = True
-
-    install_mpack(options)
-
-    stacks_directory = configs[serverConfiguration.STACK_LOCATION_KEY]
-    common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
-    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
-    mpacks_staging_directory = os.path.join(mpacks_directory, "myservice-ambari-mpack-1.0.0.0")
+                            call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0/services'),
+                            call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0/custom-services/MYSERVICE/2.0.0/dashboards')]
 
     os_mkdir_calls = [
+      call(dashboards_directory),
+      call(os.path.join(dashboards_directory, GRAFANA_DASHBOARDS_DIRNAME)),
+      call(os.path.join(dashboards_directory, SERVICE_METRICS_DIRNAME)),
       call(os.path.join(common_services_directory, "MYSERVICE"))
     ]
     create_symlink_calls = [
@@ -496,12 +531,14 @@ class TestMpacks(TestCase):
            os.path.join(stacks_directory, "MYSTACK/2.0/services/MYSERVICE"))
     ]
 
+    os_path_exists_mock.assert_has_calls(os_path_exists_calls)
     self.assertFalse(purge_stacks_and_mpacks_mock.called)
     os_mkdir_mock.assert_has_calls(os_mkdir_calls)
     create_symlink_mock.assert_has_calls(create_symlink_calls)
     os_symlink_mock.assert_has_calls(os_symlink_calls)
     self.assertTrue(add_replay_log_mock.called)
 
+  @patch("ambari_server.setupMpacks.create_symlink_using_path")
   @patch("os.path.exists")
   @patch("shutil.move")
   @patch("os.mkdir")
@@ -517,7 +554,7 @@ class TestMpacks(TestCase):
   def test_upgrade_stack_mpack(self, run_os_command_mock, download_mpack_mock, expand_mpack_mock, purge_stacks_and_mpacks_mock,
                                uninstall_mpack_mock, add_replay_log_mock, get_ambari_properties_mock,
                                get_ambari_version_mock, create_symlink_mock, os_mkdir_mock, shutil_move_mock,
-                               os_path_exists_mock):
+                               os_path_exists_mock, create_symlink_using_path_mock):
     options = self._create_empty_options_mock()
     options.mpack_path = "/path/to/mystack-1.0.0.1.tar.gz"
     download_mpack_mock.side_effect = ["/tmp/mystack-1.0.0.1.tar.gz", "/tmp/mystack-1.0.0.1.tar.gz"]
@@ -525,10 +562,27 @@ class TestMpacks(TestCase):
     get_ambari_version_mock.return_value = "2.4.0.0"
     run_os_command_mock.return_value = (0, "", "")
     mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
-    """
+    os_path_exists_mock.side_effect = [True, True, True, True, True, True, True, True,
+                                       True, True, True, True, True, True, True, False,
+                                       False, True, False, False, True, False, False,
+                                       False, False, False, True, True, True, False,
+                                       True, True, False, True, True, False, False,
+                                       False, False, False, True, True, True, True,
+                                       True, True, True, False, True, False, True, True,
+                                       True, True, True, True]
+    get_ambari_properties_mock.return_value = configs
+    shutil_move_mock.return_value = True
+
+    upgrade_mpack(options)
+
+    stacks_directory = configs[serverConfiguration.STACK_LOCATION_KEY]
+    common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
+    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
+    mpacks_staging_directory = os.path.join(mpacks_directory, "mystack-ambari-mpack-1.0.0.1")
+    dashboards_directory = serverConfiguration.get_dashboard_location(configs)
+
     os_path_exists_calls = [call('/tmp/mystack-1.0.0.1.tar.gz'),
                             call('mpacks/mystack-ambari-mpack-1.0.0.1/mpack.json'),
-                            call('mpacks/mystack-ambari-mpack-1.0.0.1/hook/before_upgrade.py'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/myextension-ambari-mpack-1.0.0.0/mpack.json'),
                             call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0/mpack.json'),
@@ -536,44 +590,53 @@ class TestMpacks(TestCase):
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/mpack.json'),
                             call('/tmp/mystack-1.0.0.1.tar.gz'),
                             call('mpacks/mystack-ambari-mpack-1.0.0.1/mpack.json'),
+                            call('mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py'),
                             call('/var/lib/ambari-server/resources/stacks'),
                             call('/var/lib/ambari-server/resources/extensions'),
                             call('/var/lib/ambari-server/resources/common-services'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/cache'),
+                            call('/var/lib/ambari-server/resources/dashboards'),
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1'),
                             call('/var/lib/ambari-server/resources/common-services/SERVICEA'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEA/1.0/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEA/2.0/dashboards'),
                             call('/var/lib/ambari-server/resources/common-services/SERVICEB'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEB/1.0.0/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEB/2.0.0/dashboards'),
                             call('/var/lib/ambari-server/resources/common-services/SERVICEC'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEC/1.0.0/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/common-services/SERVICEC/2.0.0/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.0/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/1.0/services/SERVICEA/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.1'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/1.1/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/1.1/services/SERVICEA/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0'),
-                            call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0/services')]
+                            call('/var/lib/ambari-server/resources/stacks/MYSTACK/2.0/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEA/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEB/dashboards'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/3.0'),
                             call('/var/lib/ambari-server/resources/stacks/MYSTACK/3.0/services'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEA/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEB/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEB/dashboards/grafana-dashboards'),
+                            call('/var/lib/ambari-server/resources/dashboards/grafana-dashboards/SERVICEB'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEB/dashboards/service-metrics/SERVICEB.txt'),
+                            call('/var/lib/ambari-server/resources/dashboards/service-metrics/SERVICEB.txt'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/grafana-dashboards'),
+                            call('/var/lib/ambari-server/resources/dashboards/grafana-dashboards/SERVICEC'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/SERVICEC.txt'),
+                            call('/var/lib/ambari-server/resources/dashboards/service-metrics/SERVICEC.txt'),
                             call(mpacks_directory),
                             call(mpacks_directory + '/myextension-ambari-mpack-1.0.0.0/mpack.json'),
                             call(mpacks_directory + '/myservice-ambari-mpack-1.0.0.0/mpack.json'),
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.0/mpack.json'),
+                            call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/mpack.json'),
                             call(mpacks_directory + '/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py')]
-    """
-    os_path_exists_mock.side_effect = [True, True, True, True, True, True, True, True,
-                                       True, True, True, True, True, True, True,
-                                       False, True, True, False, True, True, True,
-                                       True, True, True, True, False, False,
-                                       True, True, True, True, True, True]
-    get_ambari_properties_mock.return_value = configs
-    shutil_move_mock.return_value = True
-
-    upgrade_mpack(options)
-
-    stacks_directory = configs[serverConfiguration.STACK_LOCATION_KEY]
-    common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
-    mpacks_directory = configs[serverConfiguration.MPACKS_STAGING_PATH_PROPERTY]
-    mpacks_staging_directory = os.path.join(mpacks_directory, "mystack-ambari-mpack-1.0.0.1")
 
     run_os_command_calls = [
       call([
@@ -587,6 +650,9 @@ class TestMpacks(TestCase):
     ]
 
     os_mkdir_calls = [
+      call(dashboards_directory),
+      call(os.path.join(dashboards_directory, GRAFANA_DASHBOARDS_DIRNAME)),
+      call(os.path.join(dashboards_directory, SERVICE_METRICS_DIRNAME)),
       call(os.path.join(common_services_directory, "SERVICEC")),
       call(os.path.join(stacks_directory, "MYSTACK/3.0")),
       call(os.path.join(stacks_directory, "MYSTACK/3.0/services"))
@@ -642,13 +708,25 @@ class TestMpacks(TestCase):
            "SERVICEB", True),
       call(os.path.join(mpacks_staging_directory, "stacks/MYSTACK/3.0/services"),
            os.path.join(stacks_directory, "MYSTACK/3.0/services"),
-           "SERVICEC", True)
+           "SERVICEC", True),
+      call(os.path.join(mpacks_staging_directory, "stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics"),
+           os.path.join(dashboards_directory, "service-metrics"),
+           "SERVICEC.txt", True)
+    ]
+
+    create_symlink_using_path_calls = [
+      call(os.path.join(mpacks_staging_directory, "stacks/MYSTACK/3.0/services/SERVICEC/dashboards/grafana-dashboards"),
+           os.path.join(dashboards_directory, "grafana-dashboards/SERVICEC"), True)
     ]
 
+    os_path_exists_mock.assert_has_calls(os_path_exists_calls)
     self.assertFalse(purge_stacks_and_mpacks_mock.called)
     run_os_command_mock.assert_has_calls(run_os_command_calls)
     os_mkdir_mock.assert_has_calls(os_mkdir_calls)
     create_symlink_mock.assert_has_calls(create_symlink_calls)
+    self.assertEqual(18, create_symlink_mock.call_count)
+    create_symlink_using_path_mock.assert_has_calls(create_symlink_using_path_calls)
+    self.assertEqual(1, create_symlink_using_path_mock.call_count)
     uninstall_mpack_mock.assert_has_calls([call("mystack-ambari-mpack", "1.0.0.0")])
     self.assertTrue(add_replay_log_mock.called)
 
@@ -684,6 +762,41 @@ class TestMpacks(TestCase):
     install_mpack_mock.assert_has_calls([call(install_replay_options, replay_mode=True)])
     upgrade_mpack_mock.assert_has_calls([call(upgrade_replay_options, replay_mode=True)])
 
+  @patch("resource_management.core.sudo.unlink")
+  @patch("resource_management.core.sudo.rmtree")
+  @patch("ambari_server.setupMpacks.get_ambari_version")
+  @patch("ambari_server.setupMpacks.get_ambari_properties")
+  def test_uninstall_mpack(self, get_ambari_properties_mock, get_ambari_version_mock, sudo_rmtree_mock, sudo_unlink_mock):
+    test_directory = os.path.dirname(os.path.abspath(__file__))
+    mpacks_directory = os.path.join(test_directory, "mpacks")
+    uninstall_directory = os.path.join(test_directory, "uninstall")
+    fake_configs = {
+      serverConfiguration.STACK_LOCATION_KEY : os.path.join(uninstall_directory, "stacks"),
+      serverConfiguration.COMMON_SERVICES_PATH_PROPERTY : os.path.join(uninstall_directory, "common-services"),
+      serverConfiguration.EXTENSION_PATH_PROPERTY : os.path.join(uninstall_directory, "extensions"),
+      serverConfiguration.MPACKS_STAGING_PATH_PROPERTY : mpacks_directory,
+      serverConfiguration.DASHBOARD_PATH_PROPERTY : os.path.join(uninstall_directory, "dashboards"),
+      serverConfiguration.SERVER_TMP_DIR_PROPERTY : "/tmp"
+    }
+
+    get_ambari_version_mock.return_value = "2.4.0.0"
+    get_ambari_properties_mock.return_value = fake_configs
+    stacks_directory = fake_configs[serverConfiguration.STACK_LOCATION_KEY]
+    extension_directory = fake_configs[serverConfiguration.EXTENSION_PATH_PROPERTY]
+    common_services_directory = fake_configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY]
+    dashboard_directory = fake_configs[serverConfiguration.DASHBOARD_PATH_PROPERTY]
+
+    uninstall_mpack("mystack-ambari-mpack", "1.0.0.1")
+
+    self.assertEqual(1, sudo_rmtree_mock.call_count)
+    self.assertEqual(6, sudo_unlink_mock.call_count)
+    sudo_unlink_mock_calls = [call(os.path.join(stacks_directory, "2.0/SERVICEB")),
+                              call(os.path.join(stacks_directory, "2.0/files/metainfo2.xml")),
+                              call(os.path.join(extension_directory, "SERVICEB")),
+                              call(os.path.join(common_services_directory, "SERVICEB")),
+                              call(os.path.join(dashboard_directory, "SERVICEB")),
+                              call(os.path.join(dashboard_directory, "files/STORM.txt"))]
+
   def _create_empty_options_mock(self):
     options = MagicMock()
     options.mpack_path = None

+ 270 - 0
ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/grafana-dashboards/grafana-hdfs-users.json

@@ -0,0 +1,270 @@
+{
+  "id": null,
+  "title": "HDFS - Users",
+  "originalTitle": "HDFS - Users",
+  "tags": [
+    "hdfs"
+  ],
+  "style": "dark",
+  "timezone": "browser",
+  "editable": true,
+  "hideControls": false,
+  "sharedCrosshair": false,
+  "rows": [
+    {
+      "collapse": false,
+      "editable": true,
+      "height": "25px",
+      "panels": [
+        {
+          "content": "<h4 align=\"center\">Metrics for HDFS Namenode RPC Call Queue status in terms of call volumes for top users and their priority assignment. Click on each row title to expand on demand to look at various metrics. </h4>\n<h5 align=\"center\">HDFS User metrics aren't emitted by default. You can use this <a style=\"color: green;\" href=\"https://cwiki.apache.org/confluence/display/AMBARI/Enabling+HDFS+per-user+Metrics\">document</a> as a reference to enable them.</h5>\n<h6 style=\"color:red;\" align=\"center\">This dashboard is managed by Ambari.  You may lose any changes made to this dashboard.  If you want to customize, make your own copy.</h6>",
+          "editable": true,
+          "error": false,
+          "id": 3,
+          "isNew": true,
+          "links": [],
+          "mode": "html",
+          "span": 12,
+          "style": {},
+          "title": "",
+          "type": "text"
+        }
+      ],
+      "title": "New row"
+    },
+    {
+      "collapse": false,
+      "editable": true,
+      "height": "250px",
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "datasource": null,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {
+            "leftLogBase": 1,
+            "leftMax": null,
+            "leftMin": 0,
+            "rightLogBase": 1,
+            "rightMax": null,
+            "rightMin": null,
+            "threshold1": null,
+            "threshold1Color": "rgba(216, 200, 27, 0.27)",
+            "threshold2": null,
+            "threshold2Color": "rgba(234, 112, 112, 0.22)"
+          },
+          "id": 1,
+          "isNew": true,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "hideEmpty": true,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "span": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "aggregator": "avg",
+              "alias": "Volume",
+              "app": "namenode",
+              "downsampleAggregator": "avg",
+              "errors": {},
+              "hosts": "",
+              "metric": "ipc.client.org.apache.hadoop.ipc.DecayRpcScheduler.Caller(*).Volume",
+              "precision": "default",
+              "refId": "A",
+              "transform": "diff"
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Namenode Rpc Caller Volume",
+          "tooltip": {
+            "shared": false,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "x-axis": true,
+          "y-axis": true,
+          "y_formats": [
+            "short",
+            "short"
+          ]
+        }
+      ],
+      "title": "Row"
+    },
+    {
+      "collapse": false,
+      "editable": true,
+      "height": "250px",
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "datasource": null,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {
+            "leftLogBase": 1,
+            "leftMax": null,
+            "leftMin": null,
+            "rightLogBase": 1,
+            "rightMax": null,
+            "rightMin": null,
+            "threshold1": null,
+            "threshold1Color": "rgba(216, 200, 27, 0.27)",
+            "threshold2": null,
+            "threshold2Color": "rgba(234, 112, 112, 0.22)"
+          },
+          "id": 2,
+          "isNew": true,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "hideEmpty": true,
+            "hideZero": false,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": false,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 3,
+          "points": true,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "span": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "aggregator": "avg",
+              "app": "namenode",
+              "downsampleAggregator": "avg",
+              "errors": {},
+              "metric": "ipc.client.org.apache.hadoop.ipc.DecayRpcScheduler.Caller(*).Priority",
+              "precision": "default",
+              "refId": "A",
+              "transform": "none"
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Namenode Rpc Caller Priority",
+          "tooltip": {
+            "shared": false,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "x-axis": true,
+          "y-axis": true,
+          "y_formats": [
+            "short",
+            "short"
+          ]
+        }
+      ],
+      "title": "New row"
+    }
+  ],
+  "time": {
+    "from": "now-6h",
+    "to": "now"
+  },
+  "timepicker": {
+    "now": true,
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "templating": {
+    "list": [
+      {
+        "allFormat": "glob",
+        "current": {
+          "text": "All",
+          "value": ""
+        },
+        "datasource": null,
+        "hideLabel": false,
+        "includeAll": true,
+        "multi": true,
+        "multiFormat": "glob",
+        "name": "Callers",
+        "options": [
+          {
+            "text": "All",
+            "value": "",
+            "selected": true
+          }
+        ],
+        "query": "callers",
+        "refresh": true,
+        "regex": "",
+        "type": "query"
+      }
+    ]
+  },
+  "annotations": {
+    "list": []
+  },
+  "refresh": false,
+  "schemaVersion": 8,
+  "version": 27,
+  "links": [
+    {
+      "asDropdown": true,
+      "icon": "external link",
+      "tags": [
+        "hdfs"
+      ],
+      "title": "HDFS Dashboards",
+      "type": "dashboards"
+    }
+  ]
+}

+ 7 - 0
ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/STORM.txt

@@ -0,0 +1,7 @@
+Supervisors
+Total Tasks
+Total Slots
+Used Slots
+Topologies
+Total Executors
+Free Slots

+ 1 - 0
ambari-server/src/test/python/uninstall/common-services/SERVICEA

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/services/SERVICEA

+ 1 - 0
ambari-server/src/test/python/uninstall/common-services/SERVICEB

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEB

+ 1 - 0
ambari-server/src/test/python/uninstall/dashboards/SERVICEA

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/services/SERVICEA

+ 1 - 0
ambari-server/src/test/python/uninstall/dashboards/SERVICEB

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEB

+ 17 - 0
ambari-server/src/test/python/uninstall/dashboards/files/README.txt

@@ -0,0 +1,17 @@
+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.
+
+Real file

+ 1 - 0
ambari-server/src/test/python/uninstall/dashboards/files/STORM.txt

@@ -0,0 +1 @@
+../../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/STORM.txt

+ 1 - 0
ambari-server/src/test/python/uninstall/dashboards/files/metainfo.xml

@@ -0,0 +1 @@
+../../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/2.0/metainfo.xml

+ 1 - 0
ambari-server/src/test/python/uninstall/extensions/SERVICEA

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/services/SERVICEA

+ 1 - 0
ambari-server/src/test/python/uninstall/extensions/SERVICEB

@@ -0,0 +1 @@
+../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEB

+ 1 - 0
ambari-server/src/test/python/uninstall/stacks/2.0/SERVICEA

@@ -0,0 +1 @@
+../../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/services/SERVICEA

+ 1 - 0
ambari-server/src/test/python/uninstall/stacks/2.0/SERVICEB

@@ -0,0 +1 @@
+../../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/2.0/services/SERVICEB

+ 17 - 0
ambari-server/src/test/python/uninstall/stacks/2.0/files/README.txt

@@ -0,0 +1,17 @@
+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.
+
+Real file

+ 1 - 0
ambari-server/src/test/python/uninstall/stacks/2.0/files/metainfo1.xml

@@ -0,0 +1 @@
+../../../../mpacks/mystack-ambari-mpack-1.0.0.0/stacks/MYSTACK/1.0/metainfo.xml

+ 1 - 0
ambari-server/src/test/python/uninstall/stacks/2.0/files/metainfo2.xml

@@ -0,0 +1 @@
+../../../../mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/1.0/metainfo.xml