blob: fe3105cfdcfc50a32458f4c2720c921e870dc7e9 [file] [log] [blame]
#!/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.YangData_RwProject_Project_CloudAccounts_CloudAccountList()
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.YangData_RwProject_Project_VimResources_ImageinfoList()
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.YangData_RwProject_Project_VimResources_VminfoList()
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.YangData_RwProject_Project_VimResources_NetworkinfoList(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.YangData_RwProject_Project_VimResources_PortinfoList()
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()