| # 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.rancher import RancherContainerDriver |
| |
| from libcloud.utils.py3 import httplib |
| from libcloud.test.secrets import CONTAINER_PARAMS_RANCHER |
| from libcloud.test.file_fixtures import ContainerFileFixtures |
| from libcloud.test import MockHttp |
| |
| |
| # --------------------------------------------------------------------------- # |
| # Mock Classes |
| |
| |
| class RancherMockHttp(MockHttp): |
| fixtures = ContainerFileFixtures("rancher") |
| |
| def _v1_environments(self, method, url, body, headers): |
| if method == "GET": |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_list_stacks.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| else: |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_deploy_stack.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_environments_1e9(self, method, url, body, headers): |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_deploy_stack.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_environments_1e10(self, method, url, body, headers): |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_destroy_stack.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_environments_1e1(self, method, url, body, headers): |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_activate_stack.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_services(self, method, url, body, headers): |
| if "?healthState=healthy" in url: |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_search_services.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| elif method == "GET": |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_list_services.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| else: |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_deploy_service.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_services_1s13(self, method, url, body, headers): |
| if method == "GET": |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_deploy_service.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| elif method == "DELETE": |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_destroy_service.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_services_1s6(self, method, url, body, headers): |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_activate_service.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_containers(self, method, url, body, headers): |
| if "?state=running" in url: |
| return ( |
| httplib.OK, |
| self.fixtures.load("ex_search_containers.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| elif method == "POST": |
| return ( |
| httplib.OK, |
| self.fixtures.load("deploy_container.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| return ( |
| httplib.OK, |
| self.fixtures.load("list_containers.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| def _v1_containers_1i31(self, method, url, body, headers): |
| if method == "GET": |
| return ( |
| httplib.OK, |
| self.fixtures.load("deploy_container.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| elif method == "DELETE" or "?action=stop" in url: |
| return ( |
| httplib.OK, |
| self.fixtures.load("stop_container.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| elif "?action=start" in url: |
| return ( |
| httplib.OK, |
| self.fixtures.load("start_container.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| else: |
| return ( |
| httplib.OK, |
| self.fixtures.load("deploy_container.json"), |
| {}, |
| httplib.responses[httplib.OK], |
| ) |
| |
| |
| RancherContainerDriver.connectionCls.conn_class = RancherMockHttp |
| RancherMockHttp.type = None |
| RancherMockHttp.use_param = "a" |
| |
| |
| # --------------------------------------------------------------------------- # |
| # Test Cases |
| |
| |
| class RancherContainerDriverInitTestCase(unittest.TestCase): |
| """ |
| Tests for testing the different permutations of the driver initialization |
| string. |
| """ |
| |
| def test_full_url_string(self): |
| """ |
| Test a 'full' URL string, which contains a scheme, port, and base path. |
| """ |
| path = "http://myhostname:1234/base" |
| driver = RancherContainerDriver(*CONTAINER_PARAMS_RANCHER, host=path) |
| |
| self.assertEqual(driver.secure, False) |
| self.assertEqual(driver.connection.host, "myhostname") |
| self.assertEqual(driver.connection.port, 1234) |
| self.assertEqual(driver.baseuri, "/base") |
| |
| def test_url_string_no_port(self): |
| """ |
| Test a partial URL string, which contains a scheme, and base path. |
| """ |
| path = "http://myhostname/base" |
| driver = RancherContainerDriver(*CONTAINER_PARAMS_RANCHER, host=path, port=1234) |
| |
| self.assertEqual(driver.secure, False) |
| self.assertEqual(driver.connection.host, "myhostname") |
| self.assertEqual(driver.connection.port, 1234) |
| self.assertEqual(driver.baseuri, "/base") |
| |
| def test_url_string_no_scheme(self): |
| """ |
| Test a partial URL string, which contains a port, and base path. |
| """ |
| path = "myhostname:1234/base" |
| driver = RancherContainerDriver(*CONTAINER_PARAMS_RANCHER, host=path) |
| |
| self.assertEqual(driver.secure, True) |
| self.assertEqual(driver.connection.host, "myhostname") |
| self.assertEqual(driver.connection.port, 1234) |
| self.assertEqual(driver.baseuri, "/base") |
| |
| def test_url_string_no_base_path(self): |
| """ |
| Test a partial URL string, which contains a scheme, and a port. |
| """ |
| path = "http://myhostname:1234" |
| driver = RancherContainerDriver(*CONTAINER_PARAMS_RANCHER, host=path) |
| |
| self.assertEqual(driver.secure, False) |
| self.assertEqual(driver.connection.host, "myhostname") |
| self.assertEqual(driver.connection.port, 1234) |
| self.assertEqual(driver.baseuri, "/v%s" % driver.version) |
| |
| |
| class RancherContainerDriverTestCase(unittest.TestCase): |
| def setUp(self): |
| self.driver = RancherContainerDriver(*CONTAINER_PARAMS_RANCHER) |
| |
| # Stacks |
| def test_ex_list_stacks(self): |
| stacks = self.driver.ex_list_stacks() |
| self.assertEqual(len(stacks), 6) |
| self.assertEqual(stacks[0]["id"], "1e1") |
| |
| def test_ex_deploy_stack(self): |
| stack = self.driver.ex_deploy_stack( |
| name="newstack", environment={"root_password": "password"} |
| ) |
| self.assertEqual(stack["id"], "1e9") |
| self.assertEqual(stack["environment"]["root_password"], "password") |
| |
| def test_ex_get_stack(self): |
| # also uses ex_deploy_stack.json |
| stack = self.driver.ex_get_stack("1e9") |
| self.assertEqual(stack["id"], "1e9") |
| self.assertEqual(stack["environment"]["root_password"], "password") |
| |
| def test_ex_search_stacks(self): |
| stacks = self.driver.ex_search_stacks({"healthState": "healthy"}) |
| self.assertEqual(len(stacks), 6) |
| self.assertEqual(stacks[0]["healthState"], "healthy") |
| |
| def test_ex_destroy_stack(self): |
| response = self.driver.ex_destroy_stack("1e10") |
| self.assertEqual(response, True) |
| |
| def test_ex_activate_stack(self): |
| response = self.driver.ex_activate_stack("1e1") |
| self.assertEqual(response, True) |
| |
| def test_ex_deactivate_stack(self): |
| # also uses ex_activate_stack.json |
| response = self.driver.ex_activate_stack("1e1") |
| self.assertEqual(response, True) |
| |
| def test_ex_list_services(self): |
| services = self.driver.ex_list_services() |
| self.assertEqual(len(services), 4) |
| self.assertEqual(services[0]["id"], "1s1") |
| |
| def test_ex_deploy_service(self): |
| image = ContainerImage( |
| id="hastebin", |
| name="hastebin", |
| path="rlister/hastebin", |
| version="latest", |
| driver=None, |
| ) |
| service = self.driver.ex_deploy_service( |
| name="newservice", |
| environment_id="1e1", |
| image=image, |
| environment={"root_password": "password"}, |
| ) |
| self.assertEqual(service["id"], "1s13") |
| self.assertEqual(service["environmentId"], "1e6") |
| self.assertEqual( |
| service["launchConfig"]["environment"]["root_password"], "password" |
| ) |
| self.assertEqual( |
| service["launchConfig"]["imageUuid"], "docker:rlister/hastebin:latest" |
| ) |
| |
| def test_ex_get_service(self): |
| # also uses ex_deploy_service.json |
| service = self.driver.ex_get_service("1s13") |
| self.assertEqual(service["id"], "1s13") |
| self.assertEqual(service["environmentId"], "1e6") |
| self.assertEqual( |
| service["launchConfig"]["environment"]["root_password"], "password" |
| ) |
| |
| def test_ex_search_services(self): |
| services = self.driver.ex_search_services({"healthState": "healthy"}) |
| self.assertEqual(len(services), 2) |
| self.assertEqual(services[0]["healthState"], "healthy") |
| |
| def test_ex_destroy_service(self): |
| # Not sure how to do these with returns in mockhttp |
| response = self.driver.ex_destroy_service("1s13") |
| self.assertEqual(response, True) |
| |
| def test_ex_activate_service(self): |
| response = self.driver.ex_activate_service("1s6") |
| self.assertEqual(response, True) |
| |
| def test_ex_deactivate_service(self): |
| # also uses ex_activate_service.json |
| response = self.driver.ex_activate_service("1s6") |
| self.assertEqual(response, True) |
| |
| def test_list_containers(self): |
| containers = self.driver.list_containers() |
| self.assertEqual(len(containers), 2) |
| self.assertEqual(containers[0].id, "1i1") |
| |
| def test_deploy_container(self): |
| container = self.driver.deploy_container( |
| name="newcontainer", |
| image=ContainerImage( |
| id="hastebin", |
| name="hastebin", |
| path="rlister/hastebin", |
| version="latest", |
| driver=None, |
| ), |
| environment={"STORAGE_TYPE": "file"}, |
| networkMode="managed", |
| ) |
| self.assertEqual(container.id, "1i31") |
| self.assertEqual(container.name, "newcontainer") |
| self.assertEqual(container.extra["environment"], {"STORAGE_TYPE": "file"}) |
| |
| def test_get_container(self): |
| # also uses ex_deploy_container.json |
| container = self.driver.get_container("1i31") |
| self.assertEqual(container.id, "1i31") |
| self.assertEqual(container.name, "newcontainer") |
| self.assertEqual(container.extra["environment"], {"STORAGE_TYPE": "file"}) |
| |
| def test_start_container(self): |
| container = self.driver.get_container("1i31") |
| started = container.start() |
| self.assertEqual(started.id, "1i31") |
| self.assertEqual(started.name, "newcontainer") |
| self.assertEqual(started.state, "pending") |
| self.assertEqual(started.extra["state"], "starting") |
| |
| def test_stop_container(self): |
| container = self.driver.get_container("1i31") |
| stopped = container.stop() |
| self.assertEqual(stopped.id, "1i31") |
| self.assertEqual(stopped.name, "newcontainer") |
| self.assertEqual(stopped.state, "pending") |
| self.assertEqual(stopped.extra["state"], "stopping") |
| |
| def test_ex_search_containers(self): |
| containers = self.driver.ex_search_containers({"state": "running"}) |
| self.assertEqual(len(containers), 1) |
| |
| def test_destroy_container(self): |
| container = self.driver.get_container("1i31") |
| destroyed = container.destroy() |
| self.assertEqual(destroyed.id, "1i31") |
| self.assertEqual(destroyed.name, "newcontainer") |
| self.assertEqual(destroyed.state, "pending") |
| self.assertEqual(destroyed.extra["state"], "stopping") |
| |
| |
| if __name__ == "__main__": |
| sys.exit(unittest.main()) |