X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=rwcal%2Ftest%2Ftest_container_cal.py;fp=rwcal%2Ftest%2Ftest_container_cal.py;h=3ec5ca1f79b1bc5590ead34683b4e451c794bd51;hb=6f07e6f33f751ab4ffe624f6037f887b243bece2;hp=0000000000000000000000000000000000000000;hpb=72a563886272088feb7cb52e4aafbe6d2c580ff9;p=osm%2FSO.git diff --git a/rwcal/test/test_container_cal.py b/rwcal/test/test_container_cal.py new file mode 100644 index 00000000..3ec5ca1f --- /dev/null +++ b/rwcal/test/test_container_cal.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 + +# +# Copyright 2016 RIFT.IO Inc +# +# Licensed 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 argparse +import logging +import os +import sys +import time + +import rw_peas +import rwlogger + +from gi.repository import RwcalYang + +import rift.rwcal.cloudsim +import rift.rwcal.cloudsim.lxc as lxc + +logger = logging.getLogger('rift.cal') + + +def main(argv=sys.argv[1:]): + """ + Assuming that an LVM backing-store has been created with a volume group + called 'rift', the following creates an lxc 'image' and a pair of 'vms'. + In the LXC based container CAL, an 'image' is container and a 'vm' is a + snapshot of the original container. + + In addition to the LVM backing store, it is assumed that there is a network + bridge called 'virbr0'. + + """ + logging.basicConfig(level=logging.DEBUG) + + parser = argparse.ArgumentParser() + parser.add_argument('--rootfs', '-r') + parser.add_argument('--num-vms', '-n', type=int, default=2) + parser.add_argument('--terminate', '-t', action='store_true') + + args = parser.parse_args(argv) + + # Acquire the plugin from peas + plugin = rw_peas.PeasPlugin('rwcal-plugin', 'RwCal-1.0') + engine, info, extension = plugin() + + # Get the RwLogger context + rwloggerctx = rwlogger.RwLog.Ctx.new("Cal-Log") + + cal = plugin.get_interface("Cloud") + cal.init(rwloggerctx) + + # The account object is not currently used, but it is required by the CAL + # interface, so we create an empty object here to represent it. + account = RwcalYang.CloudAccount() + account.account_type = "lxc" + + # Make sure that any containers that were previously created have been + # stopped and destroyed. + containers = lxc.containers() + + for container in containers: + lxc.stop(container) + + for container in containers: + lxc.destroy(container) + + template = os.path.join( + os.environ['RIFT_INSTALL'], + 'etc/lxc-fedora-rift.lxctemplate', + ) + + logger.info(template) + logger.info(args.rootfs) + + # Create an image that can be used to create VMs + image = RwcalYang.ImageInfoItem() + image.name = 'rift-master' + image.lxc.size = '2.5G' + image.lxc.template_path = template + image.lxc.tarfile = args.rootfs + + cal.create_image(account, image) + + # Create a VM + vms = [] + for index in range(args.num_vms): + vm = RwcalYang.VMInfoItem() + vm.vm_name = 'rift-s{}'.format(index + 1) + vm.image_id = image.id + + cal.create_vm(account, vm) + + vms.append(vm) + + # Create the default and data networks + network = RwcalYang.NetworkInfoItem(network_name='virbr0') + cal.create_network(account, network) + + os.system('/usr/sbin/brctl show') + + # Create pairs of ports to connect the networks + for index, vm in enumerate(vms): + port = RwcalYang.PortInfoItem() + port.port_name = "eth0" + port.network_id = network.network_id + port.vm_id = vm.vm_id + port.ip_address = "192.168.122.{}".format(index + 101) + port.lxc.veth_name = "rws{}".format(index) + + cal.create_port(account, port) + + # Swap out the current instance of the plugin to test that the data is + # shared among different instances + cal = plugin.get_interface("Cloud") + cal.init() + + # Start the VMs + for vm in vms: + cal.start_vm(account, vm.vm_id) + + lxc.ls() + + # Exit if the containers are not supposed to be terminated + if not args.terminate: + return + + time.sleep(3) + + # Stop the VMs + for vm in vms: + cal.stop_vm(account, vm.vm_id) + + lxc.ls() + + # Delete the VMs + for vm in vms: + cal.delete_vm(account, vm.vm_id) + + # Delete the image + cal.delete_image(account, image.id) + + +if __name__ == "__main__": + main()