|
@@ -0,0 +1,280 @@
|
|
|
+'''
|
|
|
+ Unit tests for oc image
|
|
|
+'''
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import unittest
|
|
|
+import mock
|
|
|
+import six
|
|
|
+
|
|
|
+# Removing invalid variable names for tests so that I can
|
|
|
+# keep them brief
|
|
|
+# pylint: disable=invalid-name,no-name-in-module
|
|
|
+# Disable import-error b/c our libraries aren't loaded in jenkins
|
|
|
+# pylint: disable=import-error
|
|
|
+# place class in our python path
|
|
|
+module_path = os.path.join('/'.join(os.path.realpath(__file__).split('/')[:-4]), 'library') # noqa: E501
|
|
|
+sys.path.insert(0, module_path)
|
|
|
+from oc_image import OCImage, locate_oc_binary # noqa: E402
|
|
|
+
|
|
|
+
|
|
|
+class OCImageTest(unittest.TestCase):
|
|
|
+ '''
|
|
|
+ Test class for OCImage
|
|
|
+ '''
|
|
|
+
|
|
|
+ @mock.patch('oc_image.Utils.create_tmpfile_copy')
|
|
|
+ @mock.patch('oc_image.OCImage._run')
|
|
|
+ def test_state_list(self, mock_cmd, mock_tmpfile_copy):
|
|
|
+ ''' Testing a label list '''
|
|
|
+ params = {'registry_url': 'registry.ops.openshift.com',
|
|
|
+ 'image_name': 'oso-rhel7-zagg-web',
|
|
|
+ 'image_tag': 'int',
|
|
|
+ 'namespace': 'default',
|
|
|
+ 'state': 'list',
|
|
|
+ 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
|
|
|
+ 'debug': False}
|
|
|
+
|
|
|
+ istream = '''{
|
|
|
+ "kind": "ImageStream",
|
|
|
+ "apiVersion": "v1",
|
|
|
+ "metadata": {
|
|
|
+ "name": "oso-rhel7-zagg-web",
|
|
|
+ "namespace": "default",
|
|
|
+ "selfLink": "/oapi/v1/namespaces/default/imagestreams/oso-rhel7-zagg-web",
|
|
|
+ "uid": "6ca2b199-dcdb-11e6-8ffd-0a5f8e3e32be",
|
|
|
+ "resourceVersion": "8135944",
|
|
|
+ "generation": 1,
|
|
|
+ "creationTimestamp": "2017-01-17T17:36:05Z",
|
|
|
+ "annotations": {
|
|
|
+ "openshift.io/image.dockerRepositoryCheck": "2017-01-17T17:36:05Z"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "spec": {
|
|
|
+ "tags": [
|
|
|
+ {
|
|
|
+ "name": "int",
|
|
|
+ "annotations": null,
|
|
|
+ "from": {
|
|
|
+ "kind": "DockerImage",
|
|
|
+ "name": "registry.ops.openshift.com/ops/oso-rhel7-zagg-web:int"
|
|
|
+ },
|
|
|
+ "generation": 1,
|
|
|
+ "importPolicy": {}
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "status": {
|
|
|
+ "dockerImageRepository": "172.30.183.164:5000/default/oso-rhel7-zagg-web",
|
|
|
+ "tags": [
|
|
|
+ {
|
|
|
+ "tag": "int",
|
|
|
+ "items": [
|
|
|
+ {
|
|
|
+ "created": "2017-01-17T17:36:05Z",
|
|
|
+ "dockerImageReference": "registry.ops.openshift.com/ops/oso-rhel7-zagg-web@sha256:645bab780cf18a9b764d64b02ca65c39d13cb16f19badd0a49a1668629759392",
|
|
|
+ "image": "sha256:645bab780cf18a9b764d64b02ca65c39d13cb16f19badd0a49a1668629759392",
|
|
|
+ "generation": 1
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ '''
|
|
|
+
|
|
|
+ mock_cmd.side_effect = [
|
|
|
+ (0, istream, ''),
|
|
|
+ ]
|
|
|
+
|
|
|
+ mock_tmpfile_copy.side_effect = [
|
|
|
+ '/tmp/mocked_kubeconfig',
|
|
|
+ ]
|
|
|
+
|
|
|
+ results = OCImage.run_ansible(params, False)
|
|
|
+
|
|
|
+ self.assertFalse(results['changed'])
|
|
|
+ self.assertEquals(results['results']['results'][0]['metadata']['name'], 'oso-rhel7-zagg-web')
|
|
|
+
|
|
|
+ @mock.patch('oc_image.Utils.create_tmpfile_copy')
|
|
|
+ @mock.patch('oc_image.OCImage._run')
|
|
|
+ def test_state_present(self, mock_cmd, mock_tmpfile_copy):
|
|
|
+ ''' Testing a image present '''
|
|
|
+ params = {'registry_url': 'registry.ops.openshift.com',
|
|
|
+ 'image_name': 'oso-rhel7-zagg-web',
|
|
|
+ 'image_tag': 'int',
|
|
|
+ 'namespace': 'default',
|
|
|
+ 'state': 'present',
|
|
|
+ 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
|
|
|
+ 'debug': False}
|
|
|
+
|
|
|
+ istream = '''{
|
|
|
+ "kind": "ImageStream",
|
|
|
+ "apiVersion": "v1",
|
|
|
+ "metadata": {
|
|
|
+ "name": "oso-rhel7-zagg-web",
|
|
|
+ "namespace": "default",
|
|
|
+ "selfLink": "/oapi/v1/namespaces/default/imagestreams/oso-rhel7-zagg-web",
|
|
|
+ "uid": "6ca2b199-dcdb-11e6-8ffd-0a5f8e3e32be",
|
|
|
+ "resourceVersion": "8135944",
|
|
|
+ "generation": 1,
|
|
|
+ "creationTimestamp": "2017-01-17T17:36:05Z",
|
|
|
+ "annotations": {
|
|
|
+ "openshift.io/image.dockerRepositoryCheck": "2017-01-17T17:36:05Z"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "spec": {
|
|
|
+ "tags": [
|
|
|
+ {
|
|
|
+ "name": "int",
|
|
|
+ "annotations": null,
|
|
|
+ "from": {
|
|
|
+ "kind": "DockerImage",
|
|
|
+ "name": "registry.ops.openshift.com/ops/oso-rhel7-zagg-web:int"
|
|
|
+ },
|
|
|
+ "generation": 1,
|
|
|
+ "importPolicy": {}
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "status": {
|
|
|
+ "dockerImageRepository": "172.30.183.164:5000/default/oso-rhel7-zagg-web",
|
|
|
+ "tags": [
|
|
|
+ {
|
|
|
+ "tag": "int",
|
|
|
+ "items": [
|
|
|
+ {
|
|
|
+ "created": "2017-01-17T17:36:05Z",
|
|
|
+ "dockerImageReference": "registry.ops.openshift.com/ops/oso-rhel7-zagg-web@sha256:645bab780cf18a9b764d64b02ca65c39d13cb16f19badd0a49a1668629759392",
|
|
|
+ "image": "sha256:645bab780cf18a9b764d64b02ca65c39d13cb16f19badd0a49a1668629759392",
|
|
|
+ "generation": 1
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ '''
|
|
|
+
|
|
|
+ mock_cmd.side_effect = [
|
|
|
+ (1, '', 'Error from server: imagestreams "oso-rhel7-zagg-web" not found'),
|
|
|
+ (0, '', ''),
|
|
|
+ (0, istream, ''),
|
|
|
+ ]
|
|
|
+
|
|
|
+ mock_tmpfile_copy.side_effect = [
|
|
|
+ '/tmp/mocked_kubeconfig',
|
|
|
+ ]
|
|
|
+
|
|
|
+ results = OCImage.run_ansible(params, False)
|
|
|
+
|
|
|
+ self.assertTrue(results['changed'])
|
|
|
+ self.assertTrue(results['results']['results'][0]['metadata']['name'] == 'oso-rhel7-zagg-web')
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY3, 'py2 test only')
|
|
|
+ @mock.patch('os.path.exists')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_fallback(self, mock_env_get, mock_path_exists):
|
|
|
+ ''' Testing binary lookup fallback '''
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: ''
|
|
|
+
|
|
|
+ mock_path_exists.side_effect = lambda _: False
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), 'oc')
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY3, 'py2 test only')
|
|
|
+ @mock.patch('os.path.exists')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_path(self, mock_env_get, mock_path_exists):
|
|
|
+ ''' Testing binary lookup in path '''
|
|
|
+
|
|
|
+ oc_bin = '/usr/bin/oc'
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_path_exists.side_effect = lambda f: f == oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY3, 'py2 test only')
|
|
|
+ @mock.patch('os.path.exists')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_usr_local(self, mock_env_get, mock_path_exists):
|
|
|
+ ''' Testing binary lookup in /usr/local/bin '''
|
|
|
+
|
|
|
+ oc_bin = '/usr/local/bin/oc'
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_path_exists.side_effect = lambda f: f == oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY3, 'py2 test only')
|
|
|
+ @mock.patch('os.path.exists')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_home(self, mock_env_get, mock_path_exists):
|
|
|
+ ''' Testing binary lookup in ~/bin '''
|
|
|
+
|
|
|
+ oc_bin = os.path.expanduser('~/bin/oc')
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_path_exists.side_effect = lambda f: f == oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY2, 'py3 test only')
|
|
|
+ @mock.patch('shutil.which')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_fallback_py3(self, mock_env_get, mock_shutil_which):
|
|
|
+ ''' Testing binary lookup fallback '''
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: ''
|
|
|
+
|
|
|
+ mock_shutil_which.side_effect = lambda _f, path=None: None
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), 'oc')
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY2, 'py3 test only')
|
|
|
+ @mock.patch('shutil.which')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_path_py3(self, mock_env_get, mock_shutil_which):
|
|
|
+ ''' Testing binary lookup in path '''
|
|
|
+
|
|
|
+ oc_bin = '/usr/bin/oc'
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_shutil_which.side_effect = lambda _f, path=None: oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY2, 'py3 test only')
|
|
|
+ @mock.patch('shutil.which')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_usr_local_py3(self, mock_env_get, mock_shutil_which):
|
|
|
+ ''' Testing binary lookup in /usr/local/bin '''
|
|
|
+
|
|
|
+ oc_bin = '/usr/local/bin/oc'
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_shutil_which.side_effect = lambda _f, path=None: oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|
|
|
+
|
|
|
+ @unittest.skipIf(six.PY2, 'py3 test only')
|
|
|
+ @mock.patch('shutil.which')
|
|
|
+ @mock.patch('os.environ.get')
|
|
|
+ def test_binary_lookup_in_home_py3(self, mock_env_get, mock_shutil_which):
|
|
|
+ ''' Testing binary lookup in ~/bin '''
|
|
|
+
|
|
|
+ oc_bin = os.path.expanduser('~/bin/oc')
|
|
|
+
|
|
|
+ mock_env_get.side_effect = lambda _v, _d: '/bin:/usr/bin'
|
|
|
+
|
|
|
+ mock_shutil_which.side_effect = lambda _f, path=None: oc_bin
|
|
|
+
|
|
|
+ self.assertEqual(locate_oc_binary(), oc_bin)
|