def __pre_check(self): # Check if the name of the new node is given if not self.node_id: emsg = "Missing name of the new virtual node that IP address should be managed." self.logger.error("[localhost] HappyNodeAddress: %s" % (emsg)) self.exit() # Check if the name of new node is not a duplicate (that it does not already exists). if not self._nodeExists(): emsg = "virtual node %s does not exist." % (self.node_id) self.logger.warning("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) # Check if the name of the interface is given if not self.interface: emsg = "Missing name of the network interface in virtual node." self.logger.error("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.exit() # Check if node has a given interface if not self._nodeInterfaceExists(self.interface, self.node_id): emsg = "virtual node %s does not have interface %s." % ( self.node_id, self.interface) self.logger.warning("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.exit() # Check if address is given if not self.address: emsg = "Missing IP address for virtual node." self.logger.error("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.exit() self.ip_address, self.ip_mask = IP.splitAddressMask(self.address) self.ip_address = IP.paddingZeros(self.ip_address) if not self.delete: self.add = True # Check if node has given prefix addr_prefix = IP.getPrefix(self.ip_address, self.ip_mask) if self.delete and addr_prefix not in self.getNodeInterfacePrefixes( self.interface): emsg = "virtual node %s may not have any addresses on prefix %s." % ( self.node_id, addr_prefix) self.logger.warning("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) # Check if node has this address already if self.add and self.address in self.getNodeInterfaceAddresses( self.interface): emsg = "virtual node %s already has addresses %s." % (self.node_id, self.address) self.logger.error("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.done = True
def __getNodeIPv4AddressOnPrefix(self, prefix, id): prefix_addr, prefix_mask = IP.splitAddressMask(prefix) prefix_mask = int(float(prefix_mask)) addr = prefix_addr.split(".")[:prefix_mask // 8] addr.append(str(id % 255)) addr = ".".join(addr) return addr
def __getNodeIPv6AddressOnPrefix(self, prefix, id): prefix_addr, prefix_mask = IP.splitAddressMask(prefix) addr = prefix_addr + "::" + id if addr.count(":") == 8: addr = addr.replace("::", ":") addr = IP.paddingZeros(addr) return addr
def __pre_check(self): # Check if the name of the new network is given if not self.network_id: emsg = "Missing name of the new virtual network that should be created." self.logger.error("[localhost] HappyNetworkAddress: %s" % (emsg)) self.exit() # Check if the name of new network is not a duplicate (that it does not already exists). if not self._networkExists(): emsg = "virtual network %s does not exist." % (self.network_id) self.logger.warning("[%s] HappyNetworkAddress: %s" % (self.network_id, emsg)) self.exit() # Check if address is given if not self.address: emsg = "Missing IP preifx for network %s." % (self.network_id) self.logger.error("[%s] HappyNetworkAddress: %s" % (self.network_id, emsg)) self.exit() self.ip_prefix, self.ip_mask = IP.splitAddressMask(self.address) self.ip_prefix = IP.getPrefix(self.ip_prefix, self.ip_mask) # Check if successfully parsed prefix if self.ip_prefix is None or self.ip_mask is None: emsg = "Did not understand address format %s." % (self.address) self.logger.error("[%s] HappyNetworkAddress: %s" % (self.network_id, emsg)) self.exit() if not self.delete: self.add = True # Check if network has given prefix if self.delete and self.ip_prefix not in self.getNetworkPrefixes(): emsg = "Network %s may not have prefix %s." % (self.network_id, self.ip_prefix) self.logger.warning("[%s] HappyNetworkAddress: %s" % (self.network_id, emsg))
def __post_check(self): ipaddrs = self.getIpAddresses(self.interface, self.node_id) has_ip = False for iaddr in ipaddrs: addr_part, _ = IP.splitAddressMask(iaddr) if self.ip_address == addr_part: has_ip = True break if self.add and not has_ip: emsg = "Failed to add IP address %s to node %s, interface %s." % \ (self.address, self.node_id, self.interface) self.logger.error("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.exit() if self.delete and has_ip: emsg = "Failed to delete IP address %s from node %s, interface %s." % \ (self.address, self.node_id, self.interface) self.logger.error("[%s] HappyNodeAddress: %s" % (self.node_id, emsg)) self.exit()
def __pre_check(self): # Check if the name of the new node is given if not self.node_id: emsg = "Missing name of the new virtual node that IP routes should be managed." self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() # Check if the name of new node is not a duplicate (that it does not already exists). if not self._nodeExists(): emsg = "virtual node %s does not exist." % (self.node_id) self.logger.warning("[%s] HappyNodeRoute: %s" % (self.node_id, emsg)) if not self.delete: self.add = True # Check if address is given if not self.to: emsg = "Missing address for virtual node destination (to)." self.logger.error("[%s] HappyNodeRoute: %s" % (self.node_id, emsg)) self.exit() # Check if address is given if not self.via: emsg = "Missing address for virtual gateway (via)." self.logger.error("[%s] HappyNodeRoute: %s" % (self.node_id, emsg)) self.exit() # Check for mix IP addresses if IP.isIpAddress(self.to) and IP.isIpAddress(self.via) and IP.isIpv6(self.to) != IP.isIpv6(self.via): emsg = "Mixing addresses %s and %s." % (self.to, self.via) self.logger.error("[%s] HappyNodeRoute: %s" % (self.node_id, emsg)) self.exit() # Check if destination is a node if self.to != "default" and not IP.isIpAddress(self.to): if not self._nodeExists(self.to): emsg = "Don't know what %s to-address is. If it is a node, it can't be found." % (self.to) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() else: # 'to' is a node emsg = "Destination address must be 'default' or a IP address." self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() if IP.isIpAddress(self.to): self.to = IP.paddingZeros(self.to) # Check if gateway is a node if IP.isIpAddress(self.via): self.via_address = self.via self.via_address = IP.paddingZeros(self.via_address) return if self._nodeInterfaceExists(self.via): self.via_device = self.via return if not self._nodeExists(self.via): emsg = "Don't know what %s via-address is. If it is a node, it can't be found." % (self.to) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() this_node_networks = self.getNodeNetworkIds(self.node_id) gateway_networks = self.getNodeNetworkIds(self.via) common_networks = list(set(this_node_networks).intersection(gateway_networks)) if len(common_networks) == 0: emsg = "Node %s and gateway node %s are not on the same network." % \ (self.node_id, self.via) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() if len(common_networks) > 1 and not self.prefix: emsg = "Node %s and gateway %s share more than one network. Need gateway prefix to disambiguate." % \ (self.node_id, self.via) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() if not self.prefix: gateway_addresses = self.getNodeAddressesOnNetwork(common_networks[0], self.via) if len(gateway_addresses) == 0: emsg = "Gateway node (via) %s does not have any IP addresses." % \ (self.via) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() if len(gateway_addresses) > 1 and self.prefix is None: emsg = "Node %s has more than one IP address. Need gateway prefix to disambiguate." % \ (self.via) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() # We find gateway address without using prefix. self.via_address = gateway_addresses[0] return else: if not IP.isIpAddress(self.prefix): emsg = "Prefix %s is not a valid IP address." self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() self.ip_prefix, self.ip_mask = IP.splitAddressMask(self.prefix) self.prefix = IP.getPrefix(self.ip_prefix, self.ip_mask) gateway_addresses = self.getNodeAddressesOnNetworkOnPrefix(common_networks[0], self.prefix, self.via) if len(gateway_addresses) == 0: emsg = "Cannot find any IP address on %s with prefix %s." % (self.via, self.prefix) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() if len(gateway_addresses) > 1: emsg = "Found more than one IP address on %s with prefix %s. (%s)" % \ (self.via, self.prefix, ",".join(gateway_addresses)) self.logger.error("[localhost] HappyNodeRoute: %s" % (emsg)) self.exit() self.via_address = gateway_addresses[0]