blob: 44c1937444eacf6e37f2074900ff9c19b8db22ce [file] [log] [blame]
# 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())