From e7cbc3539570ace45fcbf8fcdcdf7a46d43f078b Mon Sep 17 00:00:00 2001 From: Ryan Belgrave Date: Fri, 3 Nov 2017 20:07:59 -0500 Subject: [PATCH] remove dhcp requirement --- ingredients_tasks/omapi.py | 40 ----------------------------- ingredients_tasks/tasks/instance.py | 23 ++++++++--------- ingredients_tasks/vmware.py | 29 ++++++++++++++++++++- requirements.txt | 1 - 4 files changed, 39 insertions(+), 54 deletions(-) delete mode 100644 ingredients_tasks/omapi.py diff --git a/ingredients_tasks/omapi.py b/ingredients_tasks/omapi.py deleted file mode 100644 index 2131a38..0000000 --- a/ingredients_tasks/omapi.py +++ /dev/null @@ -1,40 +0,0 @@ -from contextlib import contextmanager - -from pypureomapi import Omapi, OmapiErrorNotFound -from simple_settings import settings - - -class OmapiClient(object): - def __init__(self, dhcp_server, port, key_name, key): - self.dhcp_server = dhcp_server - self.port = port - self.key_name = key_name - self.key = key - self.client = None - - def connect(self): - self.client = Omapi(self.dhcp_server, self.port, self.key_name, self.key) - - def disconnect(self): - self.client.close() - - def add_host(self, ip, mac): - # TODO: lookup if ip already exists and delete it - try: - old_mac = self.client.lookup_mac(ip) - self.client.del_host(old_mac) - except OmapiErrorNotFound: - pass - self.client.add_host(ip, mac) - - @classmethod - @contextmanager - def client_session(cls): - omapi_client = OmapiClient(settings.DHCP_SERVER_IP, settings.DHCP_OMAPI_PORT, settings.DHCP_KEY_NAME, - settings.DHCP_B64_KEY) - omapi_client.connect() - - try: - yield omapi_client - finally: - omapi_client.disconnect() diff --git a/ingredients_tasks/tasks/instance.py b/ingredients_tasks/tasks/instance.py index 006c062..9c353c0 100644 --- a/ingredients_tasks/tasks/instance.py +++ b/ingredients_tasks/tasks/instance.py @@ -6,7 +6,6 @@ from ingredients_db.models.instance import InstanceState from ingredients_db.models.network import Network from ingredients_db.models.network_port import NetworkPort -from ingredients_tasks.omapi import OmapiClient from ingredients_tasks.tasks.tasks import InstanceTask from ingredients_tasks.vmware import VMWareClient @@ -43,11 +42,16 @@ def create_instance(self, **kwargs): # calculate the next available ip address which is at most O(n) time with n being the number of # ip addresses in the cidr with self.database.session() as nested_session: - network_port = nested_session.query(NetworkPort).filter(NetworkPort.id == instance.network_port_id).first() + network_port: NetworkPort = nested_session.query(NetworkPort).filter( + NetworkPort.id == instance.network_port_id).first() - network = nested_session.query(Network).filter( + network: Network = nested_session.query(Network).filter( Network.id == network_port.network_id).with_for_update().first() + dns_servers = [] + for dns_server in network.dns_servers: + dns_servers.append(str(dns_server)) + logger.info('Allocating IP address for instance %s' % str(instance.id)) if network_port.ip_address is not None: # An ip address was already allocated (how?! the task should have failed) so let's reset it @@ -65,15 +69,9 @@ def create_instance(self, **kwargs): nested_session.commit() logger.info('Creating backing vm for instance %s' % str(instance.id)) - vmware_vm = vmware.create_vm(vm_name=str(instance.id), image=vmware_image, port_group=port_group) - - nic_mac = vmware.find_vm_mac(vmware_vm) - if nic_mac is None: - raise LookupError("Could not find mac address of nic") - - logger.info('Telling DHCP about our IP for instance %s' % str(instance.id)) - with OmapiClient.client_session() as omapi: - omapi.add_host(str(ip_address), nic_mac) + vmware_vm = vmware.create_vm(vm_name=str(instance.id), image=vmware_image, port_group=port_group, + ip_address=str(ip_address), gateway=str(network.gateway), + subnet_mask=str(network.gateway.netmask), dns_servers=dns_servers) logger.info('Powering on backing vm for instance %s' % str(instance.id)) vmware.power_on_vm(vmware_vm) @@ -100,6 +98,7 @@ def delete_instance(self, delete_backing: bool, **kwargs): instance.state = InstanceState.DELETED self.request.session.delete(instance) + self.request.session.flush() self.request.session.delete(network_port) diff --git a/ingredients_tasks/vmware.py b/ingredients_tasks/vmware.py index 75c1ba1..0cb111e 100644 --- a/ingredients_tasks/vmware.py +++ b/ingredients_tasks/vmware.py @@ -43,7 +43,7 @@ def get_vm(self, vm_name): raise LookupError("Could not find Instances folder with the name of %s" % settings.VCENTER_INSTANCES_FOLDER) return self.get_obj_in_folder([vim.VirtualMachine], vms_folder, vm_name) - def create_vm(self, vm_name, image, port_group): + def create_vm(self, vm_name, image, port_group, ip_address, gateway, subnet_mask, dns_servers): vms_folder = self.get_obj([vim.Folder], settings.VCENTER_INSTANCES_FOLDER) if vms_folder is None: raise LookupError("Could not find Instances folder with the name of %s" % settings.VCENTER_INSTANCES_FOLDER) @@ -82,6 +82,33 @@ def create_vm(self, vm_name, image, port_group): nic.device.connectable.startConnected = True nic.device.connectable.allowGuestControl = True + globalip = vim.vm.customization.GlobalIPSettings() + globalip.dnsServerList = dns_servers + + guest_map = vim.vm.customization.AdapterMapping() + guest_map.adapter = vim.vm.customization.IPSettings() + guest_map.adapter.ip = vim.vm.customization.FixedIp() + guest_map.adapter.ip.ipAddress = ip_address + guest_map.adapter.subnetMask = subnet_mask + guest_map.adapter.gateway = gateway + + ident = vim.vm.customization.LinuxPrep() + ident.domain = 'sandwich.local' + ident.hostName = vim.vm.customization.FixedName() + ident.hostName.name = 'ip-' + ip_address.replace(".", "-") + + customspec = vim.vm.customization.Specification() + customspec.nicSettingMap = [guest_map] + customspec.globalIPSettings = globalip + customspec.identity = ident + + clonespec.customization = customspec + + # TODO: guest customization with ip + # To disable cloud-init's network configuration capabilities, write a file + # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: + # network: {config: disabled} + vmconf = vim.vm.ConfigSpec() vmconf.numCPUs = 1 # TODO: allow customization of these vmconf.memoryMB = 1024 diff --git a/requirements.txt b/requirements.txt index 13bed62..961af27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ celery==4.1.0 # BSD 3-clause pyvmomi==6.5.0.2017.5-1 # Apache 2.0 -pypureomapi==0.6 # Apache 2.0 ingredients.db # MIT \ No newline at end of file