--- /dev/null
+#!/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()