Merge "Adding svn for file download."
This commit is contained in:
commit
0135caa4c8
|
@ -16,11 +16,14 @@
|
||||||
import base64
|
import base64
|
||||||
import git
|
import git
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import requests
|
import requests
|
||||||
import shutil
|
import shutil
|
||||||
|
import subprocess
|
||||||
import urlparse
|
import urlparse
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
from oslo_utils import encodeutils
|
||||||
|
|
||||||
from muranoagent.common import config
|
from muranoagent.common import config
|
||||||
|
|
||||||
|
@ -113,6 +116,8 @@ class FilesManager(object):
|
||||||
try:
|
try:
|
||||||
if self._is_git_repository(url_file):
|
if self._is_git_repository(url_file):
|
||||||
git.Git().clone(url_file, folder)
|
git.Git().clone(url_file, folder)
|
||||||
|
elif self._is_svn_repository(url_file):
|
||||||
|
self._download_svn(url_file, folder)
|
||||||
else:
|
else:
|
||||||
self._download_file(url_file, folder)
|
self._download_file(url_file, folder)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -160,3 +165,41 @@ class FilesManager(object):
|
||||||
return (url.startswith(("git://",
|
return (url.startswith(("git://",
|
||||||
"git+http://", "git+https:/"))
|
"git+http://", "git+https:/"))
|
||||||
or url.endswith('.git'))
|
or url.endswith('.git'))
|
||||||
|
|
||||||
|
def _is_svn_repository(self, url):
|
||||||
|
http_regex = "https?://(.*)/svn/(.*)"
|
||||||
|
http_matches = re.search(http_regex, url)
|
||||||
|
svn_regex = "svn://(.*)"
|
||||||
|
svn_matches = re.search(svn_regex, url)
|
||||||
|
if http_matches is None and svn_matches is None:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _download_svn(self, url_file, folder):
|
||||||
|
self._execute_command("svn checkout {0} --non-interactive "
|
||||||
|
"--trust-server-cert {1}".
|
||||||
|
format(url_file, folder))
|
||||||
|
|
||||||
|
def _execute_command(self, command):
|
||||||
|
|
||||||
|
process = subprocess.Popen(
|
||||||
|
command,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
universal_newlines=True,
|
||||||
|
cwd=os.getcwd(),
|
||||||
|
shell=True)
|
||||||
|
stdout, stderr = process.communicate(input)
|
||||||
|
retcode = process.poll()
|
||||||
|
|
||||||
|
if stdout is not None:
|
||||||
|
stdout = encodeutils.safe_decode('utf-8')
|
||||||
|
LOG.debug(stdout)
|
||||||
|
|
||||||
|
if stderr is not None:
|
||||||
|
stderr = encodeutils.safe_decode('utf-8')
|
||||||
|
LOG.error(stderr)
|
||||||
|
|
||||||
|
if retcode != 0:
|
||||||
|
raise ValueError(stderr)
|
||||||
|
|
|
@ -35,6 +35,22 @@ class TestFileManager(base.MuranoAgentTestCase):
|
||||||
super(TestFileManager, self).setUp()
|
super(TestFileManager, self).setUp()
|
||||||
CONF.set_override('storage', 'cache')
|
CONF.set_override('storage', 'cache')
|
||||||
|
|
||||||
|
def test_is_svn(self):
|
||||||
|
files = files_manager.FilesManager(self.get_template_downloable())
|
||||||
|
self.assertTrue(files._is_svn_repository("https://sdfa/svn/ss"))
|
||||||
|
|
||||||
|
def test_is_svn_first(self):
|
||||||
|
files = files_manager.FilesManager(self.get_template_downloable())
|
||||||
|
self.assertTrue(files._is_svn_repository("svn://test"))
|
||||||
|
|
||||||
|
def test_is_svn_wrong_http_protocol(self):
|
||||||
|
files = files_manager.FilesManager(self.get_template_downloable())
|
||||||
|
self.assertFalse(files._is_svn_repository("httpp://sdfa/svn/ss"))
|
||||||
|
|
||||||
|
def test_is_svn_wrong_svn_slash(self):
|
||||||
|
files = files_manager.FilesManager(self.get_template_downloable())
|
||||||
|
self.assertFalse(files._is_svn_repository("svn:sdfa/svn/ss"))
|
||||||
|
|
||||||
@mock.patch('os.makedirs')
|
@mock.patch('os.makedirs')
|
||||||
def test_get_folder_git(self, mock_path):
|
def test_get_folder_git(self, mock_path):
|
||||||
"""It gets the folder where the URL is a git URL."""
|
"""It gets the folder where the URL is a git URL."""
|
||||||
|
@ -89,6 +105,20 @@ class TestFileManager(base.MuranoAgentTestCase):
|
||||||
files = files_manager.FilesManager(self.get_template_downloable())
|
files = files_manager.FilesManager(self.get_template_downloable())
|
||||||
files._download_url_file(template.Files['file'])
|
files._download_url_file(template.Files['file'])
|
||||||
|
|
||||||
|
@mock.patch('subprocess.Popen')
|
||||||
|
@mock.patch('os.makedirs')
|
||||||
|
def test_execution_plan_type_svn(self, mock_makedir, mock_subproc_popen):
|
||||||
|
"""Test an execution plan with svn files."""
|
||||||
|
process_mock = mock.Mock()
|
||||||
|
attrs = {'communicate.return_value': ('ouput', 'ok'),
|
||||||
|
'poll.return_value': 0}
|
||||||
|
process_mock.configure_mock(**attrs)
|
||||||
|
mock_subproc_popen.return_value = process_mock
|
||||||
|
|
||||||
|
template = self.get_template_svn()
|
||||||
|
files = files_manager.FilesManager(template)
|
||||||
|
files._download_url_file(template.Files['file'])
|
||||||
|
|
||||||
@mock.patch('os.makedirs')
|
@mock.patch('os.makedirs')
|
||||||
def test_execution_plan_type_downloable_no_Url(self, mock_makedir):
|
def test_execution_plan_type_downloable_no_Url(self, mock_makedir):
|
||||||
"""It validates the URL."""
|
"""It validates the URL."""
|
||||||
|
@ -164,7 +194,19 @@ class TestFileManager(base.MuranoAgentTestCase):
|
||||||
Files={
|
Files={
|
||||||
'file': {
|
'file': {
|
||||||
'Name': 'myfile',
|
'Name': 'myfile',
|
||||||
'URL': 'https://www.apache.org/licenses/LICENSE-2.0',
|
'URL': 'https://www.apache.org/licenses',
|
||||||
|
'Type': 'Downloadable'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_template_svn(self):
|
||||||
|
return bunch.Bunch(
|
||||||
|
ID='ID',
|
||||||
|
Files={
|
||||||
|
'file': {
|
||||||
|
'Name': 'svn',
|
||||||
|
'URL': 'https://mysvn/svn/repo',
|
||||||
'Type': 'Downloadable'
|
'Type': 'Downloadable'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue