예제 #1
0
 def setUp(self, docker_mock):
     self.on_change = Mock()
     self.docker_client_mock = Mock()
     docker_mock.from_env.return_value = self.docker_client_mock
     self.events_mock = Mock()
     self.docker_client_mock.events.return_value = self.events_mock
     self.image_observer = ImageObserver(self.on_change)
예제 #2
0
class ImageObserver_start(TestCase):
    @patch("samcli.lib.utils.file_observer.docker")
    def setUp(self, docker_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.events_mock = Mock()
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)

    @patch("samcli.lib.utils.file_observer.threading")
    def test_successfully_start_observing(self, threading_mock):
        thread_mock = Mock()
        threading_mock.Thread.return_value = thread_mock
        self.image_observer.start()
        threading_mock.Thread.assert_called_once_with(
            target=self.image_observer._watch_images_events, daemon=True)
        thread_mock.start.assert_called_once_with()

    @patch("samcli.lib.utils.file_observer.threading")
    def test_observing_thread_start_one_time_only(self, threading_mock):
        thread_mock = Mock()
        threading_mock.Thread.return_value = thread_mock
        self.image_observer.start()
        self.image_observer.start()
        threading_mock.Thread.assert_called_once_with(
            target=self.image_observer._watch_images_events, daemon=True)
        thread_mock.start.assert_called_once_with()
예제 #3
0
class ImageObserver_watch(TestCase):
    @patch("samcli.lib.utils.file_observer.docker")
    def setUp(self, docker_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.events_mock = Mock()
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)

    def test_successfully_watch_exist_image(self):
        image_name = "test_image:test_version"
        image_mock = Mock()
        id_mock = Mock()
        image_mock.id = id_mock
        self.docker_client_mock.images.get.return_value = image_mock
        self.image_observer.watch(image_name)
        self.assertEqual(
            {
                image_name: id_mock,
            },
            self.image_observer._observed_images,
        )
        self.docker_client_mock.images.get.assert_called_with(image_name)

    def test_ImageObserverException_raised_for_not_exist_image(self):
        image_name = "test_image:test_version"
        self.docker_client_mock.images.get.side_effect = ImageNotFound("")

        with self.assertRaises(ImageObserverException):
            self.image_observer.watch(image_name)
        self.docker_client_mock.images.get.assert_called_with(image_name)
예제 #4
0
 def setUp(self, docker_mock, threading_mock):
     self.on_change = Mock()
     self.docker_client_mock = Mock()
     docker_mock.from_env.return_value = self.docker_client_mock
     self.events_mock = Mock()
     self.docker_client_mock.events.return_value = self.events_mock
     self.image_observer = ImageObserver(self.on_change)
     self.thread_mock = Mock()
     threading_mock.Thread.return_value = self.thread_mock
     self.image_observer.start()
예제 #5
0
    def setUp(self, docker_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.events_mock = Mock()
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)

        self.image_name = "test_image:test_version"
        image_mock = Mock()
        self.id_mock = Mock()
        image_mock.id = self.id_mock
        self.docker_client_mock.images.get.return_value = image_mock
        self.image_observer.watch(self.image_name)
예제 #6
0
class ImageObserver_stop(TestCase):
    @patch("samcli.lib.utils.file_observer.threading")
    @patch("samcli.lib.utils.file_observer.docker")
    def setUp(self, docker_mock, threading_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.events_mock = Mock()
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)
        self.thread_mock = Mock()
        threading_mock.Thread.return_value = self.thread_mock
        self.image_observer.start()

    def test_successfully_stop_observing(self):
        self.thread_mock.is_alive.side_effect = [True, False, False]
        self.image_observer.stop()
        self.events_mock.close.assert_called_once_with()
        self.assertEqual(self.thread_mock.is_alive.call_count, 2)
예제 #7
0
class ImageObserver_unwatch(TestCase):
    @patch("samcli.lib.utils.file_observer.docker")
    def setUp(self, docker_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.events_mock = Mock()
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)

        self.image_name = "test_image:test_version"
        image_mock = Mock()
        self.id_mock = Mock()
        image_mock.id = self.id_mock
        self.docker_client_mock.images.get.return_value = image_mock
        self.image_observer.watch(self.image_name)

    def test_successfully_unwatch_observed_image(self):
        self.image_observer.unwatch(self.image_name)
        self.assertEqual({}, self.image_observer._observed_images)

    def test_no_exception_unwatch_non_observed_image(self):
        self.image_observer.unwatch("any_image")
        self.assertEqual(
            {
                self.image_name: self.id_mock,
            },
            self.image_observer._observed_images,
        )
예제 #8
0
 def test_image_observer_initiated_successfully(self, docker_mock,
                                                threading_mock):
     on_change = Mock()
     docker_client_mock = Mock()
     docker_mock.from_env.return_value = docker_client_mock
     events_mock = Mock()
     docker_client_mock.events.return_value = events_mock
     lock_mock = Mock()
     threading_mock.Lock.return_value = lock_mock
     image_observer = ImageObserver(on_change)
     self.assertEqual(image_observer._observed_images, {})
     self.assertEqual(image_observer._input_on_change, on_change)
     self.assertEqual(image_observer.docker_client, docker_client_mock)
     self.assertEqual(image_observer.events, events_mock)
     self.assertEqual(image_observer._images_observer_thread, None)
     self.assertEqual(image_observer._lock, lock_mock)
예제 #9
0
class ImageObserver_watch_images_events(TestCase):
    @patch("samcli.lib.utils.file_observer.docker")
    def setUp(self, docker_mock):
        self.on_change = Mock()
        self.docker_client_mock = Mock()
        docker_mock.from_env.return_value = self.docker_client_mock
        self.mocked_events_list = []
        self.events_mock = iter(self.mocked_events_list)
        self.docker_client_mock.events.return_value = self.events_mock
        self.image_observer = ImageObserver(self.on_change)

        self.image_name = "test_image:test_version"
        image_mock = Mock()
        self.id_mock = Mock()
        image_mock.id = self.id_mock
        self.docker_client_mock.images.get.return_value = image_mock
        self.image_observer.watch(self.image_name)

    def test_invoke_input_on_change_handler_if_image_id_changed(self):
        new_id_mock = Mock()
        self.mocked_events_list += [{
            "Action": "tag",
            "id": new_id_mock,
            "Actor": {
                "Attributes": {
                    "name": self.image_name
                }
            }
        }]
        self.image_observer._watch_images_events()
        self.assertEqual({self.image_name: new_id_mock},
                         self.image_observer._observed_images)
        self.on_change.assert_called_once_with([self.image_name])

    def test_input_on_change_handler_not_invoked_if_image_id_not_changed(self):
        self.mocked_events_list += [{
            "Action": "tag",
            "id": self.id_mock,
            "Actor": {
                "Attributes": {
                    "name": self.image_name
                }
            }
        }]
        self.image_observer._watch_images_events()
        self.assertEqual({self.image_name: self.id_mock},
                         self.image_observer._observed_images)
        self.on_change.assert_not_called()

    def test_skip_non_observed_images(self):
        image_name = "any_image"
        self.mocked_events_list += [{
            "Action": "tag",
            "id": self.id_mock,
            "Actor": {
                "Attributes": {
                    "name": image_name
                }
            }
        }]
        self.image_observer._watch_images_events()
        self.assertEqual({self.image_name: self.id_mock},
                         self.image_observer._observed_images)
        self.on_change.assert_not_called()

    def test_skip_non_tag_events(self):
        new_id_mock = Mock()
        self.mocked_events_list += [{
            "Action": "Create",
            "id": new_id_mock,
            "Actor": {
                "Attributes": {
                    "name": self.image_name
                }
            }
        }]
        self.image_observer._watch_images_events()
        self.assertEqual({self.image_name: self.id_mock},
                         self.image_observer._observed_images)
        self.on_change.assert_not_called()