Mini Shell
# 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())
Zerion Mini Shell 1.0