Commit c882edb7 by Belákovics Ádám

Create decorator to wrap openstack Error

parent eee9882b
......@@ -92,7 +92,16 @@ ipython_config.py
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
# SageMath parsed files ✘ cgergo@cgergo  ~/mount/virtual/interface_openstack   vm ●  git status
On branch vm
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
deleted: implementation/instance.py
deleted: implementation/instance.pyc
*.sage.py
# Environments
......
......@@ -7,6 +7,8 @@ verify_ssl = true
[packages]
openstacksdk = "*"
novaclient = "*"
python-novaclient = "*"
[requires]
python_version = "3.6"
from interface.vm.instance import InstanceInterface
from interface.vm.vm import Instance
from interface.vm.resources import Instance
from openstack.exceptions import SDKException
# from novaclient import client
import logging
def openstackError(func):
def wrap_OpenStackError(*args, **kw):
""" Decorator to wrap openstack error in simple Exception.
Return decorated function
"""
try:
return func(*args, **kw)
except SDKException as e:
logging.error(e.get_error_message())
new_e = Exception(e.get_error_message())
new_e.OpenStackError = True
raise new_e
return wrap_OpenStackError
class OSVirtualMachineManager(InstanceInterface):
......@@ -8,41 +27,42 @@ class OSVirtualMachineManager(InstanceInterface):
super().__init__()
self.openstack = cloud
def create_base_vm(self, resource, networks):
raise NotImplementedError
@openstackError
def create_base_vm(self, name, resource, networks, block_dev_map):
flavor = self.get_flavor(resource)
new_server = self.compute.create_server(name=name,
flavorRef=flavor.id,
networks=networks,
block_device_mapping=block_dev_map
)
return new_server
@openstackError
def create_vm_from_template(self, image, resource, networks):
self.create_multiple_vm_from_template(image, resource, networks, 1)
def create_vm_from_template(self, template, resource, networks):
self.create_multiple_vm_from_template(template, resource, 1)
def create_multiple_vm_from_template(self, template, resource, networks,
number, block_dev_map=None,
metadata=None):
flav = self.openstack.compute.find_flavor(resource['name'])
# TODO plan flavors
if flav is None:
flav = self.openstack.compute.create_flavor(name=resource['name'],
ram=resource['ram'],
vcpus=resource['cpu'],
disk=resource['disk'])
image = self.openstack.compute.find_image(template)
@openstackError
def create_multiple_vm_from_template(self, image, resource, networks,
number, **args):
compute = self.openstack.compute
flav = compute.find_flavor(resource['name'])
image = compute.find_image(image)
if not image:
raise ValueError("The template not found")
compute = self.openstack.compute
new_server = compute.create_server(name=template,
new_server = compute.create_server(name=image,
flavorRef=flav.id,
imageRef=image.id,
networks=networks,
min_count=number,
block_device_mapping=block_dev_map,
metadata=metadata
)
new_server = self.openstack.compute.wait_for_server(new_server)
return new_server
@openstackError
def get_vm(self, name_or_id=None):
if not name_or_id:
raise ValueError("Name or id doesn't given")
......@@ -51,55 +71,63 @@ class OSVirtualMachineManager(InstanceInterface):
raise ValueError("Could not get the vm")
return server_instance
@openstackError
def start_vm(self, name_or_id=None):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.start_server(instance)
@openstackError
def stop_vm(self, name_or_id=None):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.stop_server(instance)
@openstackError
def suspend_vm(self, name_or_id=None):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.suspend_server(instance)
@openstackError
def wake_up_vm(self, name_or_id=None):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.resume_server(instance)
@openstackError
def reboot_vm(self, name_or_id):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.reboot_server(instance, reboot_type='SOFT')
@openstackError
def reset_vm(self, name_or_id):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.reboot_server(instance, reboot_type='HARD')
@openstackError
def destroy_vm(self, name_or_id):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.delete_server(instance)
@openstackError
def get_status(self, name_or_id):
if name_or_id:
instance = self.get_vm(name_or_id)
return instance.status
@openstackError
def list_all_vm(self):
return self.openstack.compute.servers()
@openstackError
def get_vnc_console(self, name_or_id):
raise NotImplementedError
def change_password(self, name_or_id):
raise NotImplementedError
@openstackError
def resize_vm(self, name_or_id, resource):
if name_or_id:
instance = self.get_vm(name_or_id)
......@@ -107,11 +135,19 @@ class OSVirtualMachineManager(InstanceInterface):
self.openstack.compute.resize_server(instance, flavor)
@openstackError
def create_template(self, name_or_id, template_name, metadata=None):
if name_or_id:
instance = self.get_vm(name_or_id)
self.openstack.compute.create_server_image(instance, template_name, metadata)
# def get_vnc_console(self, name_or_id):
# with client.Client(2, "admin", "64c7ee341d03844c548c",
# "2db5309f541c4466bc80bc534cf579d7", "http://10.34.0.113/identity") as nova:
# if name_or_id:
# instance = nova.servers.get(name_or_id)
# return instance.get_vnc_console()
def attach_volume(self, name_or_id, amount):
raise NotImplementedError
......@@ -119,7 +155,7 @@ class OSVirtualMachineManager(InstanceInterface):
return Instance(id=server.id,
resource=server.flavor.id,
name=server.name,
image=server.image,
image_id=server.image,
disks=server.volumes,
interfaces=server.interfaces,
status=server.status,
......
......@@ -61,11 +61,11 @@ class InstanceInterface:
def get_vnc_console(self, name_or_id):
raise NotImplementedError
def change_password(self, name_or_id):
raise NotImplementedError
def get_password(self, name_or_id):
raise NotImplementedError
# def change_password(self, name_or_id):
# raise NotImplementedError
#
# def get_password(self, name_or_id):
# raise NotImplementedError
def resize_vm(self, name_or_id):
raise NotImplementedError
......
......@@ -23,3 +23,15 @@ class Instance:
def JSON(self):
return json.dump(self)
class Flavor:
def __init__(self, name, id, ram, vcpus, disk):
self.id = id
self.name = name
self.ram = ram
self.vcpus = vcpus
self.initial_disk = disk
class Volume:
pass
......@@ -2,7 +2,7 @@
from implementation.vm.instance import OSVirtualMachineManager
import openstack
# openstack.enable_logging(debug=True)
openstack.enable_logging(debug=True)
conn = openstack.connect(cloud='openstack')
......@@ -15,10 +15,16 @@ print(resource)
# interface.stop_vm('a6bc504f-a422-4492-b429-e5dad2df12f4')
server = interface.get_vm("New test")
print(server)
print(interface.get_status("Uborka Test"))
#interface.create_template("New test", "test_template")
interface.create_vm_from_template("test_template", resource)
# print(interface.convert_server_to_instance(server))
# print(interface.get_vnc_console("New test"))
# interface.create_template("New test", "test_template")
# interface.create_vm_from_template("test_template", resource, [{"uuid": "c03d0d4b-413e-4cc6-9ebe-c0b5ca0dac3a"}])
# interface.resize_vm(server, resource)
# interface.reboot_vm(server.id)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment