blob: e5afafa32902b485d2b0953441a288c2448664cb [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 MockHttp, unittest
from libcloud.utils.py3 import httplib
from libcloud.compute.types import NodeState
from libcloud.test.file_fixtures import ComputeFileFixtures
from libcloud.compute.drivers.kubevirt import KubeVirtNodeDriver
from libcloud.test.common.test_kubernetes import KubernetesAuthTestCaseMixin
class KubeVirtTestCase(unittest.TestCase, KubernetesAuthTestCaseMixin):
driver_cls = KubeVirtNodeDriver
fixtures = ComputeFileFixtures("kubevirt")
def setUp(self):
KubeVirtNodeDriver.connectionCls.conn_class = KubeVirtMockHttp
self.driver = KubeVirtNodeDriver(
key="user", secret="pass", secure=True, host="foo", port=6443
)
def test_list_locations(self):
locations = self.driver.list_locations()
self.assertEqual(len(locations), 5)
self.assertEqual(locations[0].name, "default")
self.assertEqual(locations[1].name, "kube-node-lease")
self.assertEqual(locations[2].name, "kube-public")
self.assertEqual(locations[3].name, "kube-system")
namespace4 = locations[0].driver.list_locations()[4].name
self.assertEqual(namespace4, "kubevirt")
id4 = locations[2].driver.list_locations()[4].id
self.assertEqual(id4, "e6d3d7e8-0ee5-428b-8e17-5187779e5627")
def test_list_nodes(self):
nodes = self.driver.list_nodes()
id0 = "74fd7665-fbd6-4565-977c-96bd21fb785a"
self.assertEqual(len(nodes), 1)
self.assertEqual(nodes[0].extra["namespace"], "default")
valid_node_states = {NodeState.RUNNING, NodeState.PENDING, NodeState.STOPPED}
self.assertTrue(nodes[0].state in valid_node_states)
self.assertEqual(nodes[0].name, "testvm")
self.assertEqual(nodes[0].id, id0)
def test_destroy_node(self):
nodes = self.driver.list_nodes()
to_destroy = nodes[-1]
resp = self.driver.destroy_node(to_destroy)
self.assertTrue(resp)
def test_start_node(self):
nodes = self.driver.list_nodes()
r1 = self.driver.start_node(nodes[0])
self.assertTrue(r1)
def test_stop_node(self):
nodes = self.driver.list_nodes()
r1 = self.driver.stop_node(nodes[0])
self.assertTrue(r1)
def test_reboot_node(self):
nodes = self.driver.list_nodes()
for node in nodes:
if node.name == "testvm":
resp = self.driver.reboot_node(node)
self.assertTrue(resp)
class KubeVirtMockHttp(MockHttp):
fixtures = ComputeFileFixtures("kubevirt")
def _api_v1_namespaces(self, method, url, body, headers):
if method == "GET":
body = self.fixtures.load("_api_v1_namespaces.json")
else:
raise AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_default_virtualmachines(
self, method, url, body, headers
):
if method == "GET":
body = self.fixtures.load("get_default_vms.json")
resp = httplib.OK
elif method == "POST":
body = self.fixtures.load("create_vm.json")
resp = httplib.CREATED
else:
AssertionError("Unsupported method")
return (resp, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_kube_node_lease_virtualmachines(
self, method, url, body, headers
):
if method == "GET":
body = self.fixtures.load("get_kube_node_lease_vms.json")
elif method == "POST":
pass
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_kube_public_virtualmachines(
self, method, url, body, headers
):
if method == "GET":
body = self.fixtures.load("get_kube_public_vms.json")
elif method == "POST":
pass
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_kube_system_virtualmachines(
self, method, url, body, headers
):
if method == "GET":
body = self.fixtures.load("get_kube_system_vms.json")
elif method == "POST":
pass
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_kubevirt_virtualmachines(
self, method, url, body, headers
):
if method == "GET":
body = self.fixtures.load("get_kube_public_vms.json")
elif method == "POST":
pass
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_default_virtualmachines_testvm(
self, method, url, body, headers
):
header = "application/merge-patch+json"
data_stop = {"spec": {"running": False}}
data_start = {"spec": {"running": True}}
if method == "PATCH" and headers["Content-Type"] == header and body == data_start:
body = self.fixtures.load("start_testvm.json")
elif method == "PATCH" and headers["Content-Type"] == header and body == data_stop:
body = self.fixtures.load("stop_testvm.json")
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_default_virtualmachines_vm_cirros(
self, method, url, body, headers
):
header = "application/merge-patch+json"
data_stop = {"spec": {"running": False}}
data_start = {"spec": {"running": True}}
if method == "PATCH" and headers["Content-Type"] == header and body == data_start:
body = self.fixtures.load("start_vm_cirros.json")
elif method == "PATCH" and headers["Content-Type"] == header and body == data_stop:
body = self.fixtures.load("stop_vm_cirros.json")
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _apis_kubevirt_io_v1alpha3_namespaces_default_virtualmachineinstances_testvm(
self, method, url, body, headers
):
if method == "DELETE":
body = self.fixtures.load("delete_vmi_testvm.json")
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _api_v1_namespaces_default_pods(self, method, url, body, headers):
if method == "GET":
body = self.fixtures.load("get_pods.json")
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
def _api_v1_namespaces_default_services(self, method, url, body, headers):
if method == "GET":
body = self.fixtures.load("get_services.json")
else:
AssertionError("Unsupported method")
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
if __name__ == "__main__":
sys.exit(unittest.main())