# 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 sys from libcloud.test import unittest from libcloud.container.base import ContainerImage from libcloud.container.drivers.docker import DockerContainerDriver from libcloud.utils.py3 import httplib from libcloud.test.secrets import CONTAINER_PARAMS_DOCKER from libcloud.test.file_fixtures import ContainerFileFixtures from libcloud.test import MockHttp class DockerContainerDriverTestCase(unittest.TestCase): def setUp(self): # Create a test driver for each version versions = ('linux_124', 'mac_124') self.drivers = [] for version in versions: DockerContainerDriver.connectionCls.conn_class = \ DockerMockHttp DockerMockHttp.type = None DockerMockHttp.use_param = 'a' driver = DockerContainerDriver(*CONTAINER_PARAMS_DOCKER) driver.version = version self.drivers.append(driver) def test_list_images(self): for driver in self.drivers: images = driver.list_images() self.assertEqual(len(images), 4) self.assertIsInstance(images[0], ContainerImage) self.assertEqual(images[0].id, 'cf55d61f5307b7a18a45980971d6cfd40b737dd661879c4a6b3f2aecc3bc37b0') self.assertEqual(images[0].name, 'mongo:latest') def test_install_image(self): for driver in self.drivers: image = driver.install_image('ubuntu:12.04') self.assertTrue(image is not None) self.assertEqual(image.id, '992069aee4016783df6345315302fa59681aae51a8eeb2f889dea59290f21787') def test_list_containers(self): for driver in self.drivers: containers = driver.list_containers(all=True) self.assertEqual(len(containers), 6) self.assertEqual(containers[0].id, '160936dc54fe8c332095676d9379003534b8cddd7565fa63018996e06dae1b6b') self.assertEqual(containers[0].name, 'hubot') self.assertEqual(containers[0].image.name, 'stackstorm/hubot') def test_deploy_container(self): for driver in self.drivers: image = driver.list_images()[0] container = driver.deploy_container(image=image, name='test') self.assertEqual(container.id, 'a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') self.assertEqual(container.name, 'gigantic_goldberg') def test_get_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') self.assertEqual(container.id, 'a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') self.assertEqual(container.name, 'gigantic_goldberg') self.assertEqual(container.state, 'running') def test_start_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') container.start() def test_stop_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') container.stop() def test_restart_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') container.restart() def test_delete_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') container.destroy() def test_ex_rename_container(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') driver.ex_rename_container(container, 'bob') def test_ex_get_logs(self): for driver in self.drivers: container = driver.get_container('a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303') logs = driver.ex_get_logs(container) self.assertTrue(logs is not None) def test_ex_search_images(self): for driver in self.drivers: images = driver.ex_search_images('mysql') self.assertEqual(len(images), 25) self.assertEqual(images[0].name, 'mysql') class DockerMockHttp(MockHttp): fixtures = ContainerFileFixtures('docker') version = None def _version( self, method, url, body, headers): if method == 'GET': body = self.fixtures.load('linux_124/version.json') else: raise AssertionError('Unsupported method') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) def _vlinux_124_images_search( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/search.json'), {}, httplib.responses[httplib.OK]) def _vmac_124_images_search( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('mac_124/search.json'), {}, httplib.responses[httplib.OK]) def _vlinux_124_images_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/images.json'), {}, httplib.responses[httplib.OK]) def _vmac_124_images_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/images.json'), {}, httplib.responses[httplib.OK]) def _vlinux_124_images_create( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/create_image.txt'), {'Content-Type': 'application/json', 'transfer-encoding': 'chunked'}, httplib.responses[httplib.OK]) def _vmac_124_images_create( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('mac_124/create_image.txt'), {'Content-Type': 'application/json', 'transfer-encoding': 'chunked'}, httplib.responses[httplib.OK]) def _vlinux_124_containers_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/containers.json'), {}, httplib.responses[httplib.OK]) def _vmac_124_containers_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('mac_124/containers.json'), {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_create( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/create_container.json'), {}, httplib.responses[httplib.OK]) def _vmac_124_containers_create( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('mac_124/create_container.json'), {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_start( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_start( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_restart( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_restart( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_rename( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_rename( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_stop( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_stop( self, method, url, body, headers): return (httplib.NO_CONTENT, '', {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/container_a68.json'), {}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_json( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/container_a68.json'), {}, httplib.responses[httplib.OK]) def _vlinux_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_logs( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/logs.txt'), {'content-type': 'text/plain'}, httplib.responses[httplib.OK]) def _vmac_124_containers_a68c1872c74630522c7aa74b85558b06824c5e672cee334296c50fb209825303_logs( self, method, url, body, headers): return (httplib.OK, self.fixtures.load('linux_124/logs.txt'), {'content-type': 'text/plain'}, httplib.responses[httplib.OK]) if __name__ == '__main__': sys.exit(unittest.main())