diff --git a/onedns/api.py b/onedns/api.py index 159bdde..2c7f808 100644 --- a/onedns/api.py +++ b/onedns/api.py @@ -1,3 +1,4 @@ +from onedns import exception from onedns.clients import one from onedns.clients import skydns from onedns.logger import log @@ -13,10 +14,12 @@ class OneDNS(object): self._one = one.OneClient(**one_kwargs) self._skydns = skydns.SkyDNSClient(domain, etcd_kwargs=etcd_kwargs) + def _check_for_networks(self, vm): + if not hasattr(vm.template, 'nics'): + raise exception.NoNetworksError(vm) + def _get_vm_dns_entries(self, vm): entries = {} - if not hasattr(vm.template, 'nics'): - return entries hostname = vm.name primary_ip = vm.template.nics[0].ip entries[hostname] = primary_ip @@ -27,21 +30,15 @@ class OneDNS(object): return entries def add_vm(self, vm): + self._check_for_networks(vm) dns_entries = self._get_vm_dns_entries(vm) - if not dns_entries: - log.warn("No networks found for VM {id}: {vm} - skipping".format( - vm=vm.name, id=vm.id)) - return log.info("Adding VM {id}: {vm}".format(id=vm.id, vm=vm.name)) for name, ip in dns_entries.items(): self._skydns.add_host(name, ip) def remove_vm(self, vm): + self._check_for_networks(vm) dns_entries = self._get_vm_dns_entries(vm) - if not dns_entries: - log.warn("No networks found for VM {id}: {vm} - skipping".format( - vm=vm.name, id=vm.id)) - return log.info("Removing VM {id}: {vm}".format(id=vm.id, vm=vm.name)) for name, ip in dns_entries.items(): self._skydns.remove_host(name, ip) @@ -56,4 +53,7 @@ class OneDNS(object): def sync(self): for vm in self._one.vms(): - self.add_vm(vm) + try: + self.add_vm(vm) + except exception.NoNetworksError as e: + e.log(warn=True) diff --git a/onedns/exception.py b/onedns/exception.py new file mode 100644 index 0000000..5ea6b68 --- /dev/null +++ b/onedns/exception.py @@ -0,0 +1,30 @@ +from onedns.logger import log + + +class OneDnsException(Exception): + def __init__(self, *args): + self.args = args + self.msg = args[0] + + def __str__(self): + return self.msg + + def explain(self): + return '%s: %s' % (self.__class__.__name__, self.msg) + + def log(self, warn=False, show_tb=False): + if show_tb: + log.exception(self.explain()) + elif warn: + log.warn(self.explain()) + else: + log.error(self.explain()) + + +class NoNetworksError(OneDnsException): + """ + Raised when a VM doesn't have any NICs + """ + def __init__(self, vm): + self.msg = "No networks found for VM {id}: {vm}".format(vm=vm.name, + id=vm.id)