X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_ro%2Fvimconn_opennebula.py;h=8f7fad84eb2562f67ac803f9a6ab1f68719bd375;hb=cf655071ae41e1732dca955bb9990f3c7794d448;hp=eaf3021a055aac472afff1ac7efb87c2b8181cee;hpb=ea2a73ee9c827a6a3559c715423cb1a63f9123d8;p=osm%2FRO.git diff --git a/osm_ro/vimconn_opennebula.py b/osm_ro/vimconn_opennebula.py index eaf3021a..8f7fad84 100644 --- a/osm_ro/vimconn_opennebula.py +++ b/osm_ro/vimconn_opennebula.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ## -# Copyright 2017 Telefónica Digital España S.L.U. +# Copyright 2017 Telefonica Digital Spain S.L.U. # This file is part of ETSI OSM # All Rights Reserved. # @@ -26,7 +26,7 @@ vimconnector implements all the methods to interact with OpenNebula using the XML-RPC API. """ __author__ = "Jose Maria Carmona Perez,Juan Antonio Hernando Labajo, Emilio Abraham Garrido Garcia,Alberto Florez " \ - "Pages, Andres Pozo Muñoz, Santiago Perez Marin, Onlife Networks Telefonica I+D Product Innovation " + "Pages, Andres Pozo Munoz, Santiago Perez Marin, Onlife Networks Telefonica I+D Product Innovation " __date__ = "$13-dec-2017 11:09:29$" import vimconn import requests @@ -209,9 +209,33 @@ class vimconnector(vimconn.vimconnector): # os.remove("manage_bridge_OSM") def new_network(self, net_name, net_type, ip_profile=None, shared=False, vlan=None): # , **vim_specific): - """Returns the network identifier""" + """Adds a tenant network to VIM + Params: + 'net_name': name of the network + 'net_type': one of: + 'bridge': overlay isolated network + 'data': underlay E-LAN network for Passthrough and SRIOV interfaces + 'ptp': underlay E-LINE network for Passthrough and SRIOV interfaces. + 'ip_profile': is a dict containing the IP parameters of the network + 'ip_version': can be "IPv4" or "IPv6" (Currently only IPv4 is implemented) + 'subnet_address': ip_prefix_schema, that is X.X.X.X/Y + 'gateway_address': (Optional) ip_schema, that is X.X.X.X + 'dns_address': (Optional) comma separated list of ip_schema, e.g. X.X.X.X[,X,X,X,X] + 'dhcp_enabled': True or False + 'dhcp_start_address': ip_schema, first IP to grant + 'dhcp_count': number of IPs to grant. + 'shared': if this network can be seen/use by other tenants/organization + 'vlan': in case of a data or ptp net_type, the intended vlan tag to be used for the network + Returns a tuple with the network identifier and created_items, or raises an exception on error + created_items can be None or a dictionary where this method can include key-values that will be passed to + the method delete_network. Can be used to store created segments, created l2gw connections, etc. + Format is vimconnector dependent, but do not use nested dictionaries and a value of None should be the same + as not present. + """ + # oca library method cannot be used in this case (problem with cluster parameters) try: + created_items = {} # vlan = str(random.randint(self.config["vlan"]["start-range"], self.config["vlan"]["finish-range"])) # self.create_bridge_host(vlan) bridge_config = self.config["bridge_service"] @@ -262,7 +286,7 @@ class vimconnector(vimconn.vimconnector): '.format(self.user, self.passwd, config, self.config["cluster"]["id"]) r = requests.post(self.url, params) obj = untangle.parse(str(r.content)) - return obj.methodResponse.params.param.value.array.data.value[1].i4.cdata.encode('utf-8') + return obj.methodResponse.params.param.value.array.data.value[1].i4.cdata.encode('utf-8'), created_items except Exception as e: self.logger.error("Create new network error: " + str(e)) raise vimconn.vimconnException(e) @@ -293,9 +317,9 @@ class vimconnector(vimconn.vimconnector): network_id_filter = None for network in networkList: match = False - if network.name == network_name_filter and network.id == network_id_filter: + if network.name == network_name_filter and str(network.id) == str(network_id_filter): match = True - if network_name_filter is None and network.id == network_id_filter: + if network_name_filter is None and str(network.id) == str(network_id_filter): match = True if network_id_filter is None and network.name == network_name_filter: match = True @@ -328,9 +352,12 @@ class vimconnector(vimconn.vimconnector): self.logger.error("Get network " + str(net_id) + " error): " + str(e)) raise vimconn.vimconnException(e) - def delete_network(self, net_id): - """Deletes a tenant network from VIM - Returns the network identifier + def delete_network(self, net_id, created_items=None): + """ + Removes a tenant network from VIM and its associated elements + :param net_id: VIM identifier of the network, provided by method new_network + :param created_items: dictionary with extra items to be deleted. provided by method new_network + Returns the network identifier or raises an exception upon error or when network is not found """ try: # self.delete_bridge_host() @@ -372,11 +399,12 @@ class vimconnector(vimconn.vimconnector): template_name = flavor_data["name"][:-4] name = 'NAME = "{}" '.format(template_name) cpu = 'CPU = "{}" '.format(flavor_data["vcpus"]) + vcpu = 'VCPU = "{}" '.format(flavor_data["vcpus"]) memory = 'MEMORY = "{}" '.format(flavor_data["ram"]) context = 'CONTEXT = [NETWORK = "YES",SSH_PUBLIC_KEY = "$USER[SSH_PUBLIC_KEY]" ] ' graphics = 'GRAPHICS = [ LISTEN = "0.0.0.0", TYPE = "VNC" ] ' sched_requeriments = 'CLUSTER_ID={}'.format(self.config["cluster"]["id"]) - template = name + cpu + memory + context + graphics + sched_requeriments + template = name + cpu + vcpu + memory + context + graphics + sched_requeriments template_id = oca.VmTemplate.allocate(client, template) return template_id except Exception as e: @@ -429,9 +457,9 @@ class vimconnector(vimconn.vimconnector): image_id_filter = None for image in image_pool: match = False - if str(image_name_filter) == str(image.name) and image.id == image_id_filter: + if str(image_name_filter) == str(image.name) and str(image.id) == str(image_id_filter): match = True - if image_name_filter is None and image.id == image_id_filter: + if image_name_filter is None and str(image.id) == str(image_id_filter): match = True if image_id_filter is None and str(image_name_filter) == str(image.name): match = True @@ -453,7 +481,7 @@ class vimconnector(vimconn.vimconnector): name: net_id: network uuid to connect vpci: virtual vcpi to assign - model: interface model, virtio, e2000, ... + model: interface model, virtio, e1000, ... mac_address: use: 'data', 'bridge', 'mgmt' type: 'virtual', 'PF', 'VF', 'VFnotShared' @@ -470,12 +498,12 @@ class vimconnector(vimconn.vimconnector): for template in listaTemplate: if str(template.id) == str(flavor_id): cpu = ' CPU = "{}"'.format(template.template.cpu) + vcpu = ' VCPU = "{}"'.format(template.template.cpu) memory = ' MEMORY = "{}"'.format(template.template.memory) context = ' CONTEXT = [NETWORK = "YES",SSH_PUBLIC_KEY = "$USER[SSH_PUBLIC_KEY]" ]' graphics = ' GRAPHICS = [ LISTEN = "0.0.0.0", TYPE = "VNC" ]' disk = ' DISK = [ IMAGE_ID = {}]'.format(image_id) - sched_requeriments = ' SCHED_REQUIREMENTS = "CLUSTER_ID={}"'.format(self.config["cluster"]["id"]) - template_updated = cpu + memory + context + graphics + disk + sched_requeriments + template_updated = cpu + vcpu + memory + context + graphics + disk networkListVim = oca.VirtualNetworkPool(client) networkListVim.info() network = "" @@ -491,6 +519,13 @@ class vimconnector(vimconn.vimconnector): if not network_found: raise vimconn.vimconnNotFoundException("Network {} not found".format(net["net_id"])) template_updated += network + if isinstance(cloud_config, dict): + if cloud_config.get("user-data"): + if isinstance(cloud_config["user-data"], str): + template_updated += cloud_config["user-data"] + else: + for u in cloud_config["user-data"]: + template_updated += u oca.VmTemplate.update(template, template_updated) self.logger.info( "Instanciating in OpenNebula a new VM name:{} id:{}".format(template.name, template.id)) @@ -506,9 +541,10 @@ class vimconnector(vimconn.vimconnector): try: client = oca.Client(self.user + ':' + self.passwd, self.url) vm_pool = oca.VirtualMachinePool(client) + vm_pool.info() vm_exist = False for i in vm_pool: - if i.id == vm_id: + if str(i.id) == str(vm_id): vm_exist = True break if not vm_exist: @@ -555,7 +591,7 @@ class vimconnector(vimconn.vimconnector): vm_exist = False vm_element = None for i in vm_pool: - if i.id == vm_id: + if str(i.id) == str(vm_id): vm_exist = True vm_element = i break @@ -652,3 +688,4 @@ class vimconnector(vimconn.vimconnector): # return console_dict # except vimconn.vimconnException as e: # self.logger.error(e) +