2016-07-07 20:42:27 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
2016-08-30 21:43:28 +00:00
|
|
|
Tests for the archive state
|
2016-07-07 20:42:27 +00:00
|
|
|
'''
|
|
|
|
# Import python libs
|
|
|
|
from __future__ import absolute_import
|
2016-12-15 03:57:14 +00:00
|
|
|
import errno
|
|
|
|
import logging
|
2016-07-07 20:42:27 +00:00
|
|
|
import os
|
2016-09-12 21:43:06 +00:00
|
|
|
import platform
|
|
|
|
import socket
|
2016-08-30 21:43:28 +00:00
|
|
|
import threading
|
|
|
|
import tornado.ioloop
|
|
|
|
import tornado.web
|
2016-07-07 20:42:27 +00:00
|
|
|
|
|
|
|
# Import Salt Testing libs
|
2017-02-27 15:59:04 +00:00
|
|
|
import tests.integration as integration
|
2017-02-27 13:58:07 +00:00
|
|
|
from tests.support.unit import skipIf
|
2016-07-07 20:42:27 +00:00
|
|
|
|
|
|
|
# Import salt libs
|
|
|
|
import salt.utils
|
|
|
|
|
2016-12-15 03:57:14 +00:00
|
|
|
# Setup logging
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
2016-07-07 20:42:27 +00:00
|
|
|
STATE_DIR = os.path.join(integration.FILES, 'file', 'base')
|
2016-07-22 23:51:41 +00:00
|
|
|
if salt.utils.is_windows():
|
|
|
|
ARCHIVE_DIR = os.path.join("c:/", "tmp")
|
|
|
|
else:
|
2016-12-15 03:57:14 +00:00
|
|
|
ARCHIVE_DIR = '/tmp/archive'
|
2016-07-22 23:51:41 +00:00
|
|
|
|
2016-08-30 21:43:28 +00:00
|
|
|
PORT = 9999
|
|
|
|
ARCHIVE_TAR_SOURCE = 'http://localhost:{0}/custom.tar.gz'.format(PORT)
|
2016-12-15 03:57:14 +00:00
|
|
|
UNTAR_FILE = os.path.join(ARCHIVE_DIR, 'custom/README')
|
2016-08-30 21:43:28 +00:00
|
|
|
ARCHIVE_TAR_HASH = 'md5=7643861ac07c30fe7d2310e9f25ca514'
|
|
|
|
STATE_DIR = os.path.join(integration.FILES, 'file', 'base')
|
2017-01-18 18:03:55 +00:00
|
|
|
|
|
|
|
REDHAT7 = False
|
|
|
|
QUERY_OS = platform.dist()
|
|
|
|
OS_VERSION = QUERY_OS[1]
|
|
|
|
OS_FAMILY = QUERY_OS[0]
|
|
|
|
if '7' in OS_VERSION and 'centos' in OS_FAMILY:
|
2016-09-12 21:43:06 +00:00
|
|
|
REDHAT7 = True
|
2016-08-30 21:43:28 +00:00
|
|
|
|
2016-07-22 23:51:41 +00:00
|
|
|
|
2016-09-12 21:43:06 +00:00
|
|
|
@skipIf(not REDHAT7, 'Only run on redhat7 for now due to hanging issues on other OS')
|
|
|
|
class ArchiveTest(integration.ModuleCase,
|
|
|
|
integration.SaltReturnAssertsMixIn):
|
2016-08-30 21:43:28 +00:00
|
|
|
'''
|
2016-09-12 21:43:06 +00:00
|
|
|
Validate the archive state
|
2016-08-30 21:43:28 +00:00
|
|
|
'''
|
|
|
|
@classmethod
|
|
|
|
def webserver(cls):
|
|
|
|
'''
|
|
|
|
method to start tornado
|
|
|
|
static web app
|
|
|
|
'''
|
|
|
|
application = tornado.web.Application([(r"/(.*)", tornado.web.StaticFileHandler,
|
|
|
|
{"path": STATE_DIR})])
|
|
|
|
application.listen(PORT)
|
|
|
|
tornado.ioloop.IOLoop.instance().start()
|
2016-07-07 20:42:27 +00:00
|
|
|
|
2016-08-30 21:43:28 +00:00
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls):
|
2016-09-12 21:43:06 +00:00
|
|
|
'''
|
|
|
|
start tornado app on thread
|
|
|
|
and wait till its running
|
|
|
|
'''
|
2016-08-30 21:43:28 +00:00
|
|
|
cls.server_thread = threading.Thread(target=cls.webserver)
|
|
|
|
cls.server_thread.daemon = True
|
|
|
|
cls.server_thread.start()
|
2016-09-12 21:43:06 +00:00
|
|
|
# check if tornado app is up
|
|
|
|
port_closed = True
|
|
|
|
while port_closed:
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
result = sock.connect_ex(('127.0.0.1', PORT))
|
|
|
|
if result == 0:
|
|
|
|
port_closed = False
|
2016-07-07 20:42:27 +00:00
|
|
|
|
2016-08-30 21:43:28 +00:00
|
|
|
@classmethod
|
|
|
|
def tearDownClass(cls):
|
|
|
|
tornado.ioloop.IOLoop.instance().stop()
|
|
|
|
cls.server_thread.join()
|
|
|
|
|
2016-12-15 03:57:14 +00:00
|
|
|
def setUp(self):
|
|
|
|
self._clear_archive_dir()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self._clear_archive_dir()
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _clear_archive_dir():
|
|
|
|
try:
|
|
|
|
salt.utils.rm_rf(ARCHIVE_DIR)
|
|
|
|
except OSError as exc:
|
|
|
|
if exc.errno != errno.ENOENT:
|
|
|
|
raise
|
|
|
|
|
|
|
|
def _check_extracted(self, path):
|
2016-07-07 20:42:27 +00:00
|
|
|
'''
|
|
|
|
function to check if file was extracted
|
|
|
|
'''
|
2016-12-15 03:57:14 +00:00
|
|
|
log.debug('Checking for extracted file: %s', path)
|
|
|
|
self.assertTrue(os.path.isfile(path))
|
2016-07-07 20:42:27 +00:00
|
|
|
|
|
|
|
def test_archive_extracted_skip_verify(self):
|
|
|
|
'''
|
|
|
|
test archive.extracted with skip_verify
|
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
2016-08-30 21:43:28 +00:00
|
|
|
source=ARCHIVE_TAR_SOURCE, archive_format='tar',
|
2016-07-07 20:42:27 +00:00
|
|
|
skip_verify=True)
|
2016-12-15 03:57:14 +00:00
|
|
|
log.debug('ret = %s', ret)
|
2016-11-16 16:23:39 +00:00
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
2016-07-07 20:42:27 +00:00
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
2016-12-15 03:57:14 +00:00
|
|
|
self._check_extracted(UNTAR_FILE)
|
2016-07-07 20:42:27 +00:00
|
|
|
|
|
|
|
def test_archive_extracted_with_source_hash(self):
|
|
|
|
'''
|
|
|
|
test archive.extracted without skip_verify
|
2016-07-22 23:51:41 +00:00
|
|
|
only external resources work to check to
|
|
|
|
ensure source_hash is verified correctly
|
2016-07-07 20:42:27 +00:00
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
|
|
|
source=ARCHIVE_TAR_SOURCE, archive_format='tar',
|
|
|
|
source_hash=ARCHIVE_TAR_HASH)
|
2016-12-15 03:57:14 +00:00
|
|
|
log.debug('ret = %s', ret)
|
2016-11-16 16:23:39 +00:00
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
|
|
|
|
2016-07-07 20:42:27 +00:00
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
2016-12-15 03:57:14 +00:00
|
|
|
self._check_extracted(UNTAR_FILE)
|
2016-07-07 20:42:27 +00:00
|
|
|
|
2016-11-30 19:11:41 +00:00
|
|
|
@skipIf(os.geteuid() != 0, 'you must be root to run this test')
|
|
|
|
def test_archive_extracted_with_root_user_and_group(self):
|
|
|
|
'''
|
2016-12-15 03:57:14 +00:00
|
|
|
test archive.extracted with user and group set to "root"
|
2016-11-30 19:11:41 +00:00
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
|
|
|
source=ARCHIVE_TAR_SOURCE, archive_format='tar',
|
|
|
|
source_hash=ARCHIVE_TAR_HASH,
|
|
|
|
user='root', group='root')
|
2016-12-15 03:57:14 +00:00
|
|
|
log.debug('ret = %s', ret)
|
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
|
|
|
|
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
|
|
|
self._check_extracted(UNTAR_FILE)
|
|
|
|
|
|
|
|
@skipIf(os.geteuid() != 0, 'you must be root to run this test')
|
|
|
|
def test_archive_extracted_with_strip_in_options(self):
|
|
|
|
'''
|
|
|
|
test archive.extracted with --strip in options
|
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
|
|
|
source=ARCHIVE_TAR_SOURCE,
|
|
|
|
source_hash=ARCHIVE_TAR_HASH,
|
|
|
|
options='--strip=1',
|
|
|
|
enforce_toplevel=False)
|
|
|
|
log.debug('ret = %s', ret)
|
2016-11-30 19:11:41 +00:00
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
|
|
|
|
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
2016-12-15 03:57:14 +00:00
|
|
|
self._check_extracted(os.path.join(ARCHIVE_DIR, 'README'))
|
|
|
|
|
|
|
|
@skipIf(os.geteuid() != 0, 'you must be root to run this test')
|
|
|
|
def test_archive_extracted_with_strip_components_in_options(self):
|
|
|
|
'''
|
|
|
|
test archive.extracted with --strip-components in options
|
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
|
|
|
source=ARCHIVE_TAR_SOURCE,
|
|
|
|
source_hash=ARCHIVE_TAR_HASH,
|
|
|
|
options='--strip-components=1',
|
|
|
|
enforce_toplevel=False)
|
|
|
|
log.debug('ret = %s', ret)
|
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
|
|
|
|
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
|
|
|
self._check_extracted(os.path.join(ARCHIVE_DIR, 'README'))
|
|
|
|
|
|
|
|
def test_archive_extracted_without_archive_format(self):
|
|
|
|
'''
|
|
|
|
test archive.extracted with no archive_format option
|
|
|
|
'''
|
|
|
|
ret = self.run_state('archive.extracted', name=ARCHIVE_DIR,
|
|
|
|
source=ARCHIVE_TAR_SOURCE,
|
|
|
|
source_hash=ARCHIVE_TAR_HASH)
|
|
|
|
log.debug('ret = %s', ret)
|
|
|
|
if 'Timeout' in ret:
|
|
|
|
self.skipTest('Timeout talking to local tornado server.')
|
|
|
|
self.assertSaltTrueReturn(ret)
|
|
|
|
|
|
|
|
self._check_extracted(UNTAR_FILE)
|