You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2014/05/30 20:05:47 UTC

git commit: AMBARI-5965 Usability: .repo file template should be part of a Stack definition (aonishuk via dsen)

Repository: ambari
Updated Branches:
  refs/heads/trunk c8de2f181 -> aff11a3b5


AMBARI-5965 Usability: .repo file template should be part of a Stack definition (aonishuk via dsen)


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

Branch: refs/heads/trunk
Commit: aff11a3b5315cbadd35df61a41764522e7b742fb
Parents: c8de2f1
Author: Dmitry Sen <ds...@hortonworks.com>
Authored: Fri May 30 21:05:37 2014 +0300
Committer: Dmitry Sen <ds...@hortonworks.com>
Committed: Fri May 30 21:05:37 2014 +0300

----------------------------------------------------------------------
 .../libraries/providers/repository.py           | 13 ++--
 .../libraries/resources/repository.py           |  1 +
 .../libraries/script/repo_installer.py          | 63 -----------------
 .../libraries/script/script.py                  |  4 +-
 .../TestRepositoryResource.py                   | 74 ++++++++++++++------
 .../python/resource_management/TestScript.py    |  6 +-
 .../1.3.2/hooks/before-INSTALL/scripts/hook.py  |  2 +
 .../hooks/before-INSTALL/scripts/params.py      |  7 +-
 .../scripts/repo_initialization.py              | 55 +++++++++++++++
 .../before-INSTALL/templates/repo_debian.j2     |  1 +
 .../before-INSTALL/templates/repo_suse_rhel.j2  |  7 ++
 .../2.0.6/hooks/before-INSTALL/scripts/hook.py  |  3 +-
 .../hooks/before-INSTALL/scripts/params.py      |  4 ++
 .../scripts/repo_initialization.py              | 54 ++++++++++++++
 .../before-INSTALL/templates/repo_debian.j2     |  1 +
 .../before-INSTALL/templates/repo_suse_rhel.j2  |  7 ++
 .../hooks/before-INSTALL/test_before_install.py |  8 +++
 .../python/stacks/2.0.6/configs/default.json    |  3 +-
 .../hooks/before-INSTALL/test_before_install.py |  8 +++
 19 files changed, 220 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/main/python/resource_management/libraries/providers/repository.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/libraries/providers/repository.py b/ambari-agent/src/main/python/resource_management/libraries/providers/repository.py
index 32fa75b..330395e 100644
--- a/ambari-agent/src/main/python/resource_management/libraries/providers/repository.py
+++ b/ambari-agent/src/main/python/resource_management/libraries/providers/repository.py
@@ -31,21 +31,16 @@ class RhelSuseRepositoryProvider(Provider):
     with Environment.get_instance_copy() as env:
       repo_file_name = self.resource.repo_file_name
       repo_dir = repos_dirs[env.system.os_family]
-      
+      repo_template = self.resource.repo_template
       File(format("{repo_dir}/{repo_file_name}.repo"),
-        content = InlineTemplate("""[{{repo_id}}]
-name={{repo_file_name}}
-{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
-path=/
-enabled=1
-gpgcheck=0""", repo_id=self.resource.repo_id, repo_file_name=self.resource.repo_file_name, base_url=self.resource.base_url, mirror_list=self.resource.mirror_list)
+        content = Template(repo_template, repo_id=self.resource.repo_id, repo_file_name=self.resource.repo_file_name, base_url=self.resource.base_url, mirror_list=self.resource.mirror_list)
       )
   
   def action_remove(self):
     with Environment.get_instance_copy() as env:
       repo_file_name = self.resource.repo_file_name
       repo_dir = repos_dirs[env.system.os_family]
-        
+
       File(format("{repo_dir}/{repo_file_name}.repo"),
            action = "delete")
     
@@ -65,7 +60,7 @@ class DebianRepositoryProvider(Provider):
     with Environment.get_instance_copy() as env:
       with tempfile.NamedTemporaryFile() as tmpf:
         File(tmpf.name,
-          content = InlineTemplate("{{package_type}} {{base_url}} {{components}}", 
+          content = Template(self.resource.repo_template,
               package_type=self.package_type, base_url=self.resource.base_url, components=' '.join(self.resource.components))
         )
         

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/main/python/resource_management/libraries/resources/repository.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/libraries/resources/repository.py b/ambari-agent/src/main/python/resource_management/libraries/resources/repository.py
index ad6c919..48a347a 100644
--- a/ambari-agent/src/main/python/resource_management/libraries/resources/repository.py
+++ b/ambari-agent/src/main/python/resource_management/libraries/resources/repository.py
@@ -30,6 +30,7 @@ class Repository(Resource):
   base_url = ResourceArgument()
   mirror_list = ResourceArgument()
   repo_file_name = ResourceArgument()
+  repo_template = ResourceArgument()
   components = ForcedListArgument(default=[]) # ubuntu specific
 
   actions = Resource.actions + ["create","remove"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/main/python/resource_management/libraries/script/repo_installer.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/libraries/script/repo_installer.py b/ambari-agent/src/main/python/resource_management/libraries/script/repo_installer.py
deleted file mode 100644
index 082aaea..0000000
--- a/ambari-agent/src/main/python/resource_management/libraries/script/repo_installer.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-
-'''
-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 json
-from resource_management.libraries.resources.repository import Repository
-
-UBUNTU_REPO_COMPONENTS = ["HDP", "main"]
-
-class RepoInstaller():    
-  @classmethod
-  def install_repos(cls, config):
-    cls._alter_repo("create", config['hostLevelParams']['repo_info'])
-    
-    if 'service_repo_info' in config['hostLevelParams']:
-      cls._alter_repo("create", config['hostLevelParams']['service_repo_info'])
-      
-  @classmethod
-  def remove_repos(cls, config):
-    cls._alter_repo("remove", config['hostLevelParams']['repo_info'])
-    
-    if 'service_repo_info' in config['hostLevelParams']:
-      cls._alter_repo("remove", config['hostLevelParams']['service_repo_info'])
-      
-  @staticmethod
-  def _alter_repo(action, repo_string):
-    """
-    @param action: "delete" or "create"
-    @param repo_string: e.g. "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
-    """
-    repo_dicts = json.loads(repo_string)
-    
-    if not isinstance(repo_dicts, list):
-      repo_dicts = [repo_dicts]
-      
-    for repo in repo_dicts:   
-      if not 'baseUrl' in repo:
-        repo['baseUrl'] = None
-      if not 'mirrorsList' in repo:
-        repo['mirrorsList'] = None
-      
-      Repository(repo['repoId'],
-                 action = action,
-                 base_url = repo['baseUrl'],
-                 mirror_list = repo['mirrorsList'],
-                 repo_file_name = repo['repoName'],
-                 components = UBUNTU_REPO_COMPONENTS, # ubuntu specific
-      )

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/main/python/resource_management/libraries/script/script.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/libraries/script/script.py b/ambari-agent/src/main/python/resource_management/libraries/script/script.py
index 3fbb067..69e7493 100644
--- a/ambari-agent/src/main/python/resource_management/libraries/script/script.py
+++ b/ambari-agent/src/main/python/resource_management/libraries/script/script.py
@@ -29,7 +29,6 @@ from resource_management.core.environment import Environment
 from resource_management.core.exceptions import Fail, ClientComponentHasNoStatus, ComponentIsNotRunning
 from resource_management.core.resources.packaging import Package
 from resource_management.libraries.script.config_dictionary import ConfigDictionary
-from resource_management.libraries.script.repo_installer import RepoInstaller
 
 USAGE = """Usage: {0} <COMMAND> <JSON_CONFIG> <BASEDIR> <STROUTPUT> <LOGGING_LEVEL>
 
@@ -152,12 +151,11 @@ class Script(object):
 
   def install_packages(self, env, exclude_packages=[]):
     """
-    List of packages that are required by service is received from the server
+    List of packages that are required< by service is received from the server
     as a command parameter. The method installs all packages
     from this list
     """
     config = self.get_config()
-    RepoInstaller.install_repos(config)
     
     try:
       package_list_str = config['hostLevelParams']['package_list']

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
index 529a887..db44f77 100644
--- a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
+++ b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
@@ -16,12 +16,40 @@ See the License for the specific language governing permissions and
 limitations under the License.
 '''
 
-import os
+import os, sys
 import tempfile
 from unittest import TestCase
 from mock.mock import patch, MagicMock
 
 from resource_management import *
+from resource_management.libraries.providers import repository
+
+
+class DummyTemplate(object):
+
+  def __init__(self, name, extra_imports=[], **kwargs):
+    self._template = InlineTemplate(DummyTemplate._inline_text, extra_imports, **kwargs)
+    self.context = self._template.context
+    self.name = name
+
+  def get_content(self):
+    self.content = self._template.get_content()
+    return self.content
+
+  @classmethod
+  def create(cls, text):
+    cls._inline_text = text
+    return cls
+
+DEBIAN_DEFAUTL_TEMPLATE = "{{package_type}} {{base_url}} {{components}}\n"
+RHEL_SUSE_DEFAULT_TEMPLATE ="""[{{repo_id}}]
+name={{repo_file_name}}
+{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
+
+path=/
+enabled=1
+gpgcheck=0
+"""
 
 
 class TestRepositoryResource(TestCase):
@@ -29,14 +57,20 @@ class TestRepositoryResource(TestCase):
     @patch("resource_management.libraries.providers.repository.File")
     def test_create_repo_redhat(self, file_mock):
         with Environment('/') as env:
+          with patch.object(repository,"Template", new=DummyTemplate.create(RHEL_SUSE_DEFAULT_TEMPLATE)):
             Repository('hadoop',
                        base_url='http://download.base_url.org/rpm/',
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
-                       repo_file_name='Repository')
+                       repo_file_name='Repository',
+                       repo_template='dummy.j2')
 
             self.assertTrue('hadoop' in env.resources['Repository'])
             defined_arguments = env.resources['Repository']['hadoop'].arguments
-            expected_arguments = {'base_url': 'http://download.base_url.org/rpm/',
+            expected_arguments = {'repo_template': 'dummy.j2',
+                                  'base_url': 'http://download.base_url.org/rpm/',
+                                  'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
+                                  'repo_file_name': 'Repository'}
+            expected_template_arguments = {'base_url': 'http://download.base_url.org/rpm/',
                                   'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
                                   'repo_file_name': 'Repository'}
 
@@ -45,30 +79,31 @@ class TestRepositoryResource(TestCase):
 
             template_item = file_mock.call_args[1]['content']
             template = str(template_item.name)
-            expected_arguments.update({'repo_id': 'hadoop'})
+            expected_template_arguments.update({'repo_id': 'hadoop'})
 
-            self.assertEqual(expected_arguments, template_item.context._dict)
-            self.assertEqual("""[{{repo_id}}]
-name={{repo_file_name}}
-{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
-path=/
-enabled=1
-gpgcheck=0""", template)
+            self.assertEqual(expected_template_arguments, template_item.context._dict)
+            self.assertEqual('dummy.j2', template)
 
 
     @patch.object(System, "os_family", new='suse')
     @patch("resource_management.libraries.providers.repository.File")
     def test_create_repo_suse(self, file_mock):
         with Environment('/') as env:
+          with patch.object(repository,"Template", new=DummyTemplate.create(RHEL_SUSE_DEFAULT_TEMPLATE)):
             Repository('hadoop',
                        base_url='http://download.base_url.org/rpm/',
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
+                       repo_template = "dummy.j2",
                        repo_file_name='Repository')
 
             self.assertTrue('hadoop' in env.resources['Repository'])
             defined_arguments = env.resources['Repository']['hadoop'].arguments
-            expected_arguments = {'base_url': 'http://download.base_url.org/rpm/',
+            expected_arguments = {'repo_template': 'dummy.j2',
                                   'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
+                                  'base_url': 'http://download.base_url.org/rpm/',
+                                  'repo_file_name': 'Repository'}
+            expected_template_arguments = {'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
+                                  'base_url': 'http://download.base_url.org/rpm/',
                                   'repo_file_name': 'Repository'}
 
             self.assertEqual(defined_arguments, expected_arguments)
@@ -76,15 +111,10 @@ gpgcheck=0""", template)
 
             template_item = file_mock.call_args[1]['content']
             template = str(template_item.name)
-            expected_arguments.update({'repo_id': 'hadoop'})
+            expected_template_arguments.update({'repo_id': 'hadoop'})
 
-            self.assertEqual(expected_arguments, template_item.context._dict)
-            self.assertEqual("""[{{repo_id}}]
-name={{repo_file_name}}
-{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
-path=/
-enabled=1
-gpgcheck=0""", template)   
+            self.assertEqual(expected_template_arguments, template_item.context._dict)
+            self.assertEqual('dummy.j2', template)
     
     
     @patch.object(tempfile, "NamedTemporaryFile")
@@ -99,9 +129,11 @@ gpgcheck=0""", template)
       tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt"
       
       with Environment('/') as env:
+        with patch.object(repository,"Template", new=DummyTemplate.create(DEBIAN_DEFAUTL_TEMPLATE)):
           Repository('HDP',
                      base_url='http://download.base_url.org/rpm/',
                      repo_file_name='HDP',
+                     repo_template = "dummy.j2",
                      components = ['a','b','c']
           )
       
@@ -130,9 +162,11 @@ gpgcheck=0""", template)
       tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt"
       
       with Environment('/') as env:
+        with patch.object(repository,"Template", new=DummyTemplate.create(DEBIAN_DEFAUTL_TEMPLATE)):
           Repository('HDP',
                      base_url='http://download.base_url.org/rpm/',
                      repo_file_name='HDP',
+                     repo_template = "dummy.j2",
                      components = ['a','b','c']
           )
       

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-agent/src/test/python/resource_management/TestScript.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/resource_management/TestScript.py b/ambari-agent/src/test/python/resource_management/TestScript.py
index 23bbef1..bff04b4 100644
--- a/ambari-agent/src/test/python/resource_management/TestScript.py
+++ b/ambari-agent/src/test/python/resource_management/TestScript.py
@@ -73,7 +73,7 @@ class TestScript(TestCase):
       Script.config = no_packages_config
       script.install_packages(env)
     resource_dump = pprint.pformat(env.resource_list)
-    self.assertEquals(resource_dump, "[Repository['HDP-2.0._']]")
+    self.assertEquals(resource_dump, "[]")
 
     # Testing empty package list
     with Environment(".", test_mode=True) as env:
@@ -81,14 +81,14 @@ class TestScript(TestCase):
       Script.config = empty_config
       script.install_packages(env)
     resource_dump = pprint.pformat(env.resource_list)
-    self.assertEquals(resource_dump, "[Repository['HDP-2.0._']]")
+    self.assertEquals(resource_dump, "[]")
 
     # Testing installing of a list of packages
     with Environment(".", test_mode=True) as env:
       Script.config = dummy_config
       script.install_packages("env")
     resource_dump = pprint.pformat(env.resource_list)
-    self.assertEqual(resource_dump, "[Repository['HDP-2.0._'],\n Repository['HDP-2.0._'],\n Package['hbase'],\n Package['yet-another-package']]")
+    self.assertEqual(resource_dump, "[Package['hbase'], Package['yet-another-package']]")
 
   @patch("__builtin__.open")
   def test_structured_out(self, open_mock):

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/hook.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/hook.py b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/hook.py
index 9b200af..626b199 100644
--- a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/hook.py
+++ b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/hook.py
@@ -20,6 +20,7 @@ limitations under the License.
 import sys
 from resource_management import *
 from shared_initialization import *
+from repo_initialization import install_repos
 
 #TODO this must be "CONFIGURE" hook when CONFIGURE command will be implemented
 class BeforeConfigureHook(Hook):
@@ -28,6 +29,7 @@ class BeforeConfigureHook(Hook):
     import params
 
     env.set_params(params)
+    install_repos()
     setup_java()
     setup_users()
     install_packages()

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/params.py b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/params.py
index 49a01cf..e7a0d47 100644
--- a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/params.py
@@ -123,4 +123,9 @@ if has_ganglia_server:
   ganglia_server_host = ganglia_server_hosts[0]
 
 hbase_tmp_dir = config['configurations']['hbase-site']['hbase.tmp.dir']
-ignore_groupsusers_create = default("ignore_groupsusers_create", False)
\ No newline at end of file
+ignore_groupsusers_create = default("ignore_groupsusers_create", False)
+
+
+#repo params
+repo_info = config['hostLevelParams']['repo_info']
+service_repo_info = default("/hostLevelParams/service_repo_info",None)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/repo_initialization.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/repo_initialization.py b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/repo_initialization.py
new file mode 100644
index 0000000..f3943ed
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/scripts/repo_initialization.py
@@ -0,0 +1,55 @@
+"""
+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.
+
+"""
+from resource_management import *
+import json
+from resource_management.core.system import System
+
+_UBUNTU_REPO_COMPONENTS = ["HDP", "main"]
+
+def _alter_repo(action, repo_string, repo_template):
+  """
+  @param action: "delete" or "create"
+  @param repo_string: e.g. "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
+  """
+  repo_dicts = json.loads(repo_string)
+
+  if not isinstance(repo_dicts, list):
+    repo_dicts = [repo_dicts]
+
+  for repo in repo_dicts:
+    if not 'baseUrl' in repo:
+      repo['baseUrl'] = None
+    if not 'mirrorsList' in repo:
+      repo['mirrorsList'] = None
+
+    Repository(repo['repoId'],
+               action = action,
+               base_url = repo['baseUrl'],
+               mirror_list = repo['mirrorsList'],
+               repo_file_name = repo['repoName'],
+               repo_template = repo_template,
+               components = _UBUNTU_REPO_COMPONENTS, # ubuntu specific
+    )
+
+def install_repos():
+  import params
+  template = "repo_suse_rhel.j2" if System.get_instance().os_family in ["suse", "redhat"] else "repo_debian.j2"
+  _alter_repo("create", params.repo_info, template)
+  if params.service_repo_info:
+    _alter_repo("create", params.service_repo_info, template)

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_debian.j2
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_debian.j2 b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_debian.j2
new file mode 100644
index 0000000..52d4c9a
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_debian.j2
@@ -0,0 +1 @@
+{{package_type}} {{base_url}} {{components}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_suse_rhel.j2
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_suse_rhel.j2 b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_suse_rhel.j2
new file mode 100644
index 0000000..d486f89
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/before-INSTALL/templates/repo_suse_rhel.j2
@@ -0,0 +1,7 @@
+[{{repo_id}}]
+name={{repo_file_name}}
+{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
+
+path=/
+enabled=1
+gpgcheck=0

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/hook.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/hook.py b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/hook.py
index bb68560..6904e9d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/hook.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/hook.py
@@ -20,7 +20,7 @@ limitations under the License.
 import sys
 from resource_management import *
 from shared_initialization import *
-
+from repo_initialization import *
 #TODO this must be "CONFIGURE" hook when CONFIGURE command will be implemented
 class BeforeConfigureHook(Hook):
 
@@ -28,6 +28,7 @@ class BeforeConfigureHook(Hook):
     import params
 
     env.set_params(params)
+    install_repos()
     install_packages()
     setup_java()
     setup_users()

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
index 852a439..f55bc2d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
@@ -101,3 +101,7 @@ jce_policy_zip = default("/hostLevelParams/jce_name", None) # None when jdk is a
 jce_location = config['hostLevelParams']['jdk_location']
 jdk_location = config['hostLevelParams']['jdk_location']
 ignore_groupsusers_create = default("ignore_groupsusers_create", False)
+
+#repo params
+repo_info = config['hostLevelParams']['repo_info']
+service_repo_info = default("/hostLevelParams/service_repo_info",None)

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
new file mode 100644
index 0000000..d3bdc70
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
@@ -0,0 +1,54 @@
+"""
+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.
+
+"""
+from resource_management import *
+import json
+
+_UBUNTU_REPO_COMPONENTS = ["HDP", "main"]
+
+def _alter_repo(action, repo_string, repo_template):
+  """
+  @param action: "delete" or "create"
+  @param repo_string: e.g. "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
+  """
+  repo_dicts = json.loads(repo_string)
+
+  if not isinstance(repo_dicts, list):
+    repo_dicts = [repo_dicts]
+
+  for repo in repo_dicts:
+    if not 'baseUrl' in repo:
+      repo['baseUrl'] = None
+    if not 'mirrorsList' in repo:
+      repo['mirrorsList'] = None
+
+    Repository(repo['repoId'],
+               action = action,
+               base_url = repo['baseUrl'],
+               mirror_list = repo['mirrorsList'],
+               repo_file_name = repo['repoName'],
+               repo_template = repo_template,
+               components = _UBUNTU_REPO_COMPONENTS, # ubuntu specific
+    )
+
+def install_repos():
+  import params
+  template = "repo_suse_rhel.j2" if System.get_instance().os_family in ["suse", "redhat"] else "repo_debian.j2"
+  _alter_repo("create", params.repo_info, template)
+  if params.service_repo_info:
+    _alter_repo("create", params.service_repo_info, template)

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_debian.j2
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_debian.j2 b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_debian.j2
new file mode 100644
index 0000000..52d4c9a
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_debian.j2
@@ -0,0 +1 @@
+{{package_type}} {{base_url}} {{components}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_suse_rhel.j2
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_suse_rhel.j2 b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_suse_rhel.j2
new file mode 100644
index 0000000..d486f89
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/templates/repo_suse_rhel.j2
@@ -0,0 +1,7 @@
+[{{repo_id}}]
+name={{repo_file_name}}
+{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
+
+path=/
+enabled=1
+gpgcheck=0

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/test/python/stacks/1.3.2/hooks/before-INSTALL/test_before_install.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/1.3.2/hooks/before-INSTALL/test_before_install.py b/ambari-server/src/test/python/stacks/1.3.2/hooks/before-INSTALL/test_before_install.py
index e7b8678..58084d0 100644
--- a/ambari-server/src/test/python/stacks/1.3.2/hooks/before-INSTALL/test_before_install.py
+++ b/ambari-server/src/test/python/stacks/1.3.2/hooks/before-INSTALL/test_before_install.py
@@ -28,6 +28,14 @@ class TestHookBeforeInstall(RMFTestCase):
                        command="hook",
                        config_file="default.json"
     )
+    self.assertResourceCalled('Repository', 'HDP-1.3.4',
+        action=['create'],
+        base_url='http://public-repo-1.hortonworks.com/HDP/centos6/1.x/updates/1.3.3.0',
+        components=['HDP', 'main'],
+        mirror_list=None,
+        repo_file_name='HDP',
+        repo_template='repo_suse_rhel.j2'
+    )
     self.assertResourceCalled('Execute', 'mkdir -p /tmp/HDP-artifacts/ ; curl -kf --retry 10 http://c6401.ambari.apache.org:8080/resources//jdk-7u45-linux-x64.tar.gz -o /tmp/HDP-artifacts//jdk-7u45-linux-x64.tar.gz',
         not_if = 'test -e /usr/jdk64/jdk1.7.0_45/bin/java',
         path = ['/bin', '/usr/bin/'],

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/test/python/stacks/2.0.6/configs/default.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/default.json b/ambari-server/src/test/python/stacks/2.0.6/configs/default.json
index 8f6d64b..099984f 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/configs/default.json
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/default.json
@@ -5,7 +5,8 @@
     "hostLevelParams": {
         "jdk_location": "http://c6401.ambari.apache.org:8080/resources/", 
         "ambari_db_rca_password": "mapred", 
-        "ambari_db_rca_url": "jdbc:postgresql://c6401.ambari.apache.org/ambarirca", 
+        "ambari_db_rca_url": "jdbc:postgresql://c6401.ambari.apache.org/ambarirca",
+        "repo_info": "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]",
         "jce_name": "UnlimitedJCEPolicyJDK7.zip", 
         "stack_version": "2.0",
         "stack_name": "HDP", 

http://git-wip-us.apache.org/repos/asf/ambari/blob/aff11a3b/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py b/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
index e15ec8b..92eed49 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
@@ -28,6 +28,14 @@ class TestHookBeforeInstall(RMFTestCase):
                        command="hook",
                        config_file="default.json"
     )
+    self.assertResourceCalled('Repository', 'HDP-2.0._',
+        action=['create'],
+        base_url='http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0',
+        components=['HDP', 'main'],
+        mirror_list=None,
+        repo_file_name='HDP',
+        repo_template='repo_suse_rhel.j2'
+    )
     self.assertResourceCalled('Package', 'unzip',)
     self.assertResourceCalled('Package', 'curl',)
     self.assertResourceCalled('Execute', 'mkdir -p /tmp/HDP-artifacts/ ;   curl -kf   --retry 10 http://c6401.ambari.apache.org:8080/resources//jdk-7u45-linux-x64.tar.gz -o /tmp/HDP-artifacts//jdk-7u45-linux-x64.tar.gz',