Beispiel #1
0
 def tearDown(self):
     print("teardown")
     vns = oca.VirtualNetworkPool(self.c)
     vns.info()
     for vn in vns:
         if vn.name.startswith('inttest'):
             vn.delete()
 def new_vminstance(self, name, description, start, image_id, flavor_id, net_list, cloud_config=None, disk_list=None,
                    availability_zone_index=None, availability_zone_list=None):
     """Adds a VM instance to VIM
     Params:
         start: indicates if VM must start or boot in pause mode. Ignored
         image_id,flavor_id: image and flavor uuid
         net_list: list of interfaces, each one is a dictionary with:
             name:
             net_id: network uuid to connect
             vpci: virtual vcpi to assign
             model: interface model, virtio, e2000, ...
             mac_address:
             use: 'data', 'bridge',  'mgmt'
             type: 'virtual', 'PF', 'VF', 'VFnotShared'
             vim_id: filled/added by this function
             #TODO ip, security groups
     Returns the instance identifier
     """
     self.logger.debug(
         "new_vminstance input: image='{}' flavor='{}' nics='{}'".format(image_id, flavor_id, str(net_list)))
     try:
         client = oca.Client(self.user + ':' + self.passwd, self.url)
         listaTemplate = oca.VmTemplatePool(client)
         listaTemplate.info()
         for template in listaTemplate:
             if str(template.id) == str(flavor_id):
                 cpu = ' CPU = "{}"'.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
                 networkListVim = oca.VirtualNetworkPool(client)
                 networkListVim.info()
                 network = ""
                 for net in net_list:
                     network_found = False
                     for network_existingInVim in networkListVim:
                         if str(net["net_id"]) == str(network_existingInVim.id):
                             net["vim_id"] = network_existingInVim["id"]
                             network = 'NIC = [NETWORK = "{}",NETWORK_UNAME = "{}" ]'.format(
                                 network_existingInVim.name, network_existingInVim.uname)
                             network_found = True
                             break
                     if not network_found:
                         raise vimconn.vimconnNotFoundException("Network {} not found".format(net["net_id"]))
                     template_updated += network
                 oca.VmTemplate.update(template, template_updated)
                 self.logger.info(
                     "Instanciating in OpenNebula a new VM name:{} id:{}".format(template.name, template.id))
                 vminstance_id = template.instantiate(name=name)
                 return str(vminstance_id), None
         raise vimconn.vimconnNotFoundException("Flavor {} not found".format(flavor_id))
     except Exception as e:
         self.logger.error("Create new vm instance error: " + str(e))
         raise vimconn.vimconnException(e)
 def pool(self):
     try:
         p = oca.VirtualNetworkPool(self.client, preload_info=True)
         # Filter flag possible values:
         # -3: Connected user's resources
         # -2: All resources
         # -1: Connected user's and his group's resources
         p.info(filter=-2, range_start=-1, range_end=-1)
         return p
     except ProtocolError:
         raise OpenNebulaError('Could not retrieve info from OpenNebula')
 def get_network(self, net_id):
     """Obtain network details of network id"""
     try:
         client = oca.Client(self.user + ':' + self.passwd, self.url)
         networkList = oca.VirtualNetworkPool(client)
         networkList.info()
         net = {}
         for network in networkList:
             if str(network.id) == str(net_id):
                 net['id'] = net_id
                 net['name'] = network.name
                 net['status'] = "ACTIVE"
                 break
         if net:
             return net
         else:
             raise vimconn.vimconnNotFoundException("Network {} not found".format(net_id))
     except Exception as e:
             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
     """
     try:
         # self.delete_bridge_host()
         client = oca.Client(self.user + ':' + self.passwd, self.url)
         networkList = oca.VirtualNetworkPool(client)
         networkList.info()
         network_deleted = False
         for network in networkList:
             if str(network.id) == str(net_id):
                 oca.VirtualNetwork.delete(network)
                 network_deleted = True
         if network_deleted:
             return net_id
         else:
             raise vimconn.vimconnNotFoundException("Network {} not found".format(net_id))
     except Exception as e:
             self.logger.error("Delete network " + str(net_id) + "error: " + str(e))
             raise vimconn.vimconnException(e)
 def get_network_list(self, filter_dict={}):
     """Obtain tenant networks of VIM
     Filter_dict can be:
         name: network name
         id: network uuid
         public: boolean
         tenant_id: tenant
         admin_state_up: boolean
         status: 'ACTIVE'
     Returns the network list of dictionaries
     """
     try:
         client = oca.Client(self.user + ':' + self.passwd, self.url)
         networkList = oca.VirtualNetworkPool(client)
         networkList.info()
         response = []
         if "name" in filter_dict.keys():
             network_name_filter = filter_dict["name"]
         else:
             network_name_filter = None
         if "id" in filter_dict.keys():
             network_id_filter = filter_dict["id"]
         else:
             network_id_filter = None
         for network in networkList:
             match = False
             if network.name == network_name_filter and str(network.id) == str(network_id_filter):
                 match = True
             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
             if match:
                 net_dict = {"name": network.name, "id": str(network.id)}
                 response.append(net_dict)
         return response
     except Exception as e:
         self.logger.error("Get network list error: " + str(e))
         raise vimconn.vimconnException(e)
def clean_opennebula(hours, network, user, pwd, endpoint):
    now = datetime.datetime.utcnow()
    delta = datetime.timedelta(hours=hours)
    client = oca.Client('{user}:{pwd}'.format(user=user, pwd=pwd),
                        'https://{host}:2633/RPC2'.format(host=endpoint))
    vms = oca.VirtualMachinePool(client)
    vms.info()
    vns = oca.VirtualNetworkPool(client)
    vns.info()
    net = vns.get_by_name(network)
    net.info()
    to_delete = []
    print("{uid:<6} {name:10} {started}".format(uid="#",
                                                name="Name",
                                                started="Started"))
    for vm in vms:
        text = "{uid:<6} {name:10} {started!s:10}".format(
            uid=vm.id,
            name=vm.name,
            started=datetime.datetime.fromtimestamp(vm.stime))
        print(text)
        if now - datetime.datetime.fromtimestamp(vm.stime) > delta:
            to_delete.append(vm)

    for vm in to_delete:
        # Release cluster IP on hold, if any
        if getattr(vm.user_template, 'reserved_ips', None):
            ips = vm.user_template.reserved_ips.split(',')
            for ip in ips:
                text = "{} IP on hold - released".format(ip)
                print(text)
                client.call('vn.release', net.id, 'LEASES=[IP={}]'.format(ip))
        # Delete VM
        text = "{uid:<6} {name:10} {started!s:10} - deleted".format(
            uid=vm.id,
            name=vm.name,
            started=datetime.datetime.fromtimestamp(vm.stime))
        print(text)
        vm.delete()
 def test_info(self):
     self.client.call = Mock(return_value=self.xml)
     pool = oca.VirtualNetworkPool(self.client)
     pool.info()
     assert len(list(pool)) == 2