def delete(request, topology_id): logger.debug('---- topology delete ----') topology_prefix = "t%s_" % topology_id if configuration.deployment_backend == "kvm": network_list = libvirtUtils.get_networks_for_topology(topology_prefix) for network in network_list: logger.debug("undefine network: " + network["name"]) libvirtUtils.undefine_network(network["name"]) domain_list = libvirtUtils.get_domains_for_topology(topology_prefix) for domain in domain_list: # remove reserved mac addresses for all domains in this topology mac_address = libvirtUtils.get_management_interface_mac_for_domain(domain["name"]) libvirtUtils.release_management_ip_for_mac(mac_address) logger.debug("undefine domain: " + domain["name"]) source_file = libvirtUtils.get_image_for_domain(domain["uuid"]) if libvirtUtils.undefine_domain(domain["uuid"]): if source_file is not None: osUtils.remove_instance(source_file) topology = get_object_or_404(Topology, pk=topology_id) osUtils.remove_instances_for_topology(topology_prefix) osUtils.remove_cloud_init_tmp_dirs(topology_prefix) topology.delete() messages.info(request, 'Topology %s deleted' % topology.name) return HttpResponseRedirect('/topologies/')
def delete_topology(request): """ DEPRECATED :param request: :return: """ logger.debug("---- delete_topology ----") json_string = request.body json_body = json.loads(json_string) required_fields = set(['name']) if not required_fields.issubset(json_body[0]): logger.error("Invalid parameters in json body") return HttpResponse(status=500) topology_name = json_body[0]["name"] try: # get the topology by name topology = Topology.objects.get(name=topology_name) except ObjectDoesNotExist: return apiUtils.return_json(False, "Topology is already deleted or does not exist") try: topology_prefix = "t%s_" % topology.id if hasattr(configuration, "use_openvswitch") and configuration.use_openvswitch: use_ovs = True else: use_ovs = False network_list = libvirtUtils.get_networks_for_topology(topology_prefix) for network in network_list: logger.debug("undefining network: " + network["name"]) libvirtUtils.undefine_network(network["name"]) if use_ovs: ovsUtils.delete_bridge(network["name"]) domain_list = libvirtUtils.get_domains_for_topology(topology_prefix) for domain in domain_list: logger.debug("undefining domain: " + domain["name"]) source_file = libvirtUtils.get_image_for_domain(domain["uuid"]) if libvirtUtils.undefine_domain(domain["uuid"]): if source_file is not None: osUtils.remove_instance(source_file) # remove reserved mac addresses for all domains in this topology mac_address = libvirtUtils.get_management_interface_mac_for_domain(domain["name"]) libvirtUtils.release_management_ip_for_mac(mac_address) topology.delete() return apiUtils.return_json(True, "Topology deleted!") except Exception as e: logger.error(str(e)) return HttpResponse(status=500)
def delete(request, topology_id): logger.debug('---- topology delete ----') topology_prefix = "t%s_" % topology_id topology = get_object_or_404(Topology, pk=topology_id) if configuration.deployment_backend == "kvm": if hasattr(configuration, "use_openvswitch") and configuration.use_openvswitch: use_ovs = True else: use_ovs = False network_list = libvirtUtils.get_networks_for_topology(topology_prefix) for network in network_list: logger.debug("undefine network: " + network["name"]) libvirtUtils.undefine_network(network["name"]) if use_ovs: ovsUtils.delete_bridge(network["name"]) domain_list = libvirtUtils.get_domains_for_topology(topology_prefix) for domain in domain_list: # remove reserved mac addresses for all domains in this topology mac_address = libvirtUtils.get_management_interface_mac_for_domain( domain["name"]) libvirtUtils.release_management_ip_for_mac(mac_address) logger.debug("undefine domain: " + domain["name"]) source_file = libvirtUtils.get_image_for_domain(domain["uuid"]) if libvirtUtils.undefine_domain(domain["uuid"]): if source_file is not None: osUtils.remove_instance(source_file) osUtils.remove_instances_for_topology(topology_prefix) osUtils.remove_cloud_init_tmp_dirs(topology_prefix) elif configuration.deployment_backend == "openstack": stack_name = topology.name.replace(' ', '_') if openstackUtils.connect_to_openstack(): logger.debug(openstackUtils.delete_stack(stack_name)) topology.delete() messages.info(request, 'Topology %s deleted' % topology.name) return HttpResponseRedirect('/topologies/')
def inline_deploy_topology(config): """ takes the topology configuration object and deploys to the appropriate hypervisor :param config: output of the wistarUtils. :return: """ if configuration.deployment_backend != 'kvm': raise WistarException( 'Cannot deploy to KVM configured deployment backend is %s' % configuration.deployment_backend) is_ovs = False is_linux = osUtils.check_is_linux() is_ubuntu = osUtils.check_is_ubuntu() if hasattr(configuration, "use_openvswitch") and configuration.use_openvswitch: is_ovs = True # only create networks on Linux/KVM logger.debug("Checking if we should create networks first!") if is_linux: for network in config["networks"]: network_xml_path = "ajax/kvm/network.xml" # Do we need openvswitch here? if is_ovs: # set the network_xml_path to point to a network configuration that defines the ovs type here network_xml_path = "ajax/kvm/network_ovs.xml" if not ovsUtils.create_bridge(network["name"]): err = "Could not create ovs bridge" logger.error(err) raise Exception(err) try: if not libvirtUtils.network_exists(network["name"]): logger.debug("Rendering networkXml for: %s" % network["name"]) network_xml = render_to_string(network_xml_path, {'network': network}) logger.debug(network_xml) libvirtUtils.define_network_from_xml(network_xml) time.sleep(.5) logger.debug("Starting network") libvirtUtils.start_network(network["name"]) except Exception as e: raise Exception(str(e)) # are we on linux? are we on Ubuntu linux? set kvm emulator accordingly vm_env = dict() vm_env["emulator"] = "/usr/libexec/qemu-kvm" vm_env["pcType"] = "rhel6.5.0" # possible values for 'cache' are 'none' (default) and 'writethrough'. Use writethrough if you want to # mount the instances directory on a glusterFs or tmpfs volume. This might make sense if you have tons of RAM # and want to alleviate IO issues. If in doubt, leave it as 'none' vm_env["cache"] = configuration.filesystem_cache_mode vm_env["io"] = configuration.filesystem_io_mode if is_linux and is_ubuntu: vm_env["emulator"] = "/usr/bin/kvm-spice" vm_env["pcType"] = "pc" # by default, we use kvm as the hypervisor domain_xml_path = "ajax/kvm/" if not is_linux: # if we're not on Linux, then let's try to use vbox instead domain_xml_path = "ajax/vbox/" for device in config["devices"]: domain_exists = False try: if libvirtUtils.domain_exists(device['name']): domain_exists = True device_domain = libvirtUtils.get_domain_by_name(device['name']) device['domain_uuid'] = device_domain.UUIDString() else: device['domain_uuid'] = '' # if not libvirtUtils.domain_exists(device["name"]): logger.debug("Rendering deviceXml for: %s" % device["name"]) configuration_file = device["configurationFile"] logger.debug("using config file: " + configuration_file) logger.debug(device) image = Image.objects.get(pk=device["imageId"]) image_base_path = settings.MEDIA_ROOT + "/" + image.filePath.url instance_path = osUtils.get_instance_path_from_image( image_base_path, device["name"]) secondary_disk = "" tertiary_disk = "" if not osUtils.check_path(instance_path): if device["resizeImage"] > 0: logger.debug('resizing image') if not osUtils.create_thick_provision_instance( image_base_path, device["name"], device["resizeImage"]): raise Exception( "Could not resize image instance for image: " + device["name"]) else: if not osUtils.create_thin_provision_instance( image_base_path, device["name"]): raise Exception( "Could not create image instance for image: " + image_base_path) if "type" in device["secondaryDiskParams"]: secondary_disk = wistarUtils.create_disk_instance( device, device["secondaryDiskParams"]) if "type" in device["tertiaryDiskParams"]: tertiary_disk = wistarUtils.create_disk_instance( device, device["tertiaryDiskParams"]) cloud_init_path = '' if device["cloudInitSupport"]: # grab the last interface management_interface = device["managementInterface"] # grab the prefix len from the management subnet which is in the form 192.168.122.0/24 if '/' in configuration.management_subnet: management_prefix_len = configuration.management_subnet.split( '/')[1] else: management_prefix_len = '24' management_ip = device['ip'] + '/' + management_prefix_len # domain_name, host_name, mgmt_ip, mgmt_interface script_string = "" script_param = "" roles = list() if 'roles' in device and type(device['roles']) is list: roles = device['roles'] if device["configScriptId"] != 0: logger.debug("Passing script data!") script = osUtils.get_cloud_init_template( device['configScriptId']) script_param = device["configScriptParam"] logger.debug("Creating cloud init path for linux image") cloud_init_path = osUtils.create_cloud_init_img( device["name"], device["label"], management_ip, management_interface, device["password"], script, script_param, roles) logger.debug(cloud_init_path) device_xml = render_to_string( domain_xml_path + configuration_file, { 'device': device, 'instancePath': instance_path, 'vm_env': vm_env, 'cloud_init_path': cloud_init_path, 'secondary_disk_path': secondary_disk, 'tertiary_disk_path': tertiary_disk, 'use_ovs': is_ovs }) logger.debug(device_xml) libvirtUtils.define_domain_from_xml(device_xml) if not domain_exists: logger.debug("Reserving IP with dnsmasq") management_mac = libvirtUtils.get_management_interface_mac_for_domain( device["name"]) logger.debug('got management mac') logger.debug(management_mac) libvirtUtils.reserve_management_ip_for_mac( management_mac, device["ip"], device["name"]) logger.debug('management ip is reserved for mac') except Exception as ex: logger.warn("Raising exception") logger.error(ex) logger.error(traceback.format_exc()) raise Exception(str(ex))