@commands.command_add('resetnetwork')
    def resetnetwork_cmd(self, data):
        """
        Configure network & hostname, restarting network.
        """

        os_mod = self.detect_os()
        if not os_mod:
            raise SystemError("Couldn't figure out my OS")

        xs_handle = pyxenstore.Handle()

        try:
            hostname = xs_handle.read(XENSTORE_HOSTNAME_PATH)
            logging.info('hostname: %r (from xenstore)' % hostname)
        except pyxenstore.NotFoundError:
            try:
                hostname = os_mod.network.get_hostname()
            except:
                hostname = _get_hostname()

            if not hostname:
                hostname = DEFAULT_HOSTNAME
            logging.info('hostname: %r (default)' % hostname)

        interfaces = []

        try:
            entries = xs_handle.entries(XENSTORE_INTERFACE_PATH)
        except pyxenstore.NotFoundError:
            entries = []

        for entry in entries:
            data = xs_handle.read(XENSTORE_INTERFACE_PATH + '/' + entry)
            data = anyjson.deserialize(data)
            interfaces.append(data)
            logging.info('interface %s: %r' % (entry, data))

        del xs_handle

        # Normalize interfaces data. It can come in a couple of different
        # (similar) formats, none of which are convenient.
        by_macaddr = dict([(mac, (up, name))
                           for name, up, mac in agentlib.get_interfaces()])

        config = {}

        for interface in interfaces:
            ifconfig = {}

            mac = interface.get('mac')
            if not mac:
                raise RuntimeError('No MAC found in config')

            # by_macaddr is keyed using lower case hexadecimal
            mac = mac.lower()

            ifconfig['mac'] = mac

            # 'label' used to be the method to determine which interface
            # this configuration applies to, but 'mac' is safer to use.
            # 'label' is now only used for printing a comment in the
            # generated configuration to easier differentiate interfaces.
            if mac not in by_macaddr:
                raise RuntimeError(mac % 'Unknown interface MAC %s')

            ifconfig['label'] = interface.get('label')

            up, ifname = by_macaddr[mac]

            # Record if the interface is up already
            ifconfig['up'] = up

            # List of IPv4 and IPv6 addresses
            ip4s = interface.get('ips', [])
            ip6s = interface.get('ip6s', [])
            if not ip4s and not ip6s:
                raise RuntimeError('No IPs found for interface')

            # Gateway (especially IPv6) can be tied to an interface
            gateway4 = interface.get('gateway')
            gateway6 = interface.get('gateway6')

            # Filter out any IPs that aren't enabled
            for ip in ip4s + ip6s:
                try:
                    ip['enabled'] = int(ip.get('enabled', 0))
                except ValueError:
                    raise RuntimeError("Invalid value %r for 'enabled' key" %
                                       ip.get('enabled'))

            ip4s = filter(lambda i: i['enabled'], ip4s)
            ip6s = filter(lambda i: i['enabled'], ip6s)

            # Validate and normalize IPv4 and IPv6 addresses
            for ip in ip4s:
                if 'ip' not in ip:
                    raise RuntimeError("Missing 'ip' key for IPv4 address")
                if 'netmask' not in ip:
                    raise RuntimeError("Missing 'netmask' key for IPv4 address")

                # Rename 'ip' to 'address' to be more specific
                ip['address'] = ip.pop('ip')
                ip['prefixlen'] = NETMASK_TO_PREFIXLEN[ip['netmask']]

            for ip in ip6s:
                if 'ip' not in ip and 'address' not in ip:
                    raise RuntimeError("Missing 'ip' or 'address' key for IPv6 address")
                if 'netmask' not in ip:
                    raise RuntimeError("Missing 'netmask' key for IPv6 address")

                if 'gateway' in ip:
                    # FIXME: Should we fail if gateway6 is already set?
                    gateway6 = ip.pop('gateway')

                # FIXME: Should we fail if both 'ip' and 'address' are
                # specified but differ?

                # Rename 'ip' to 'address' to be more specific
                if 'address' not in ip:
                    ip['address'] = ip.pop('ip')

                # Rename 'netmask' to 'prefixlen' to be more accurate
                ip['prefixlen'] = ip.pop('netmask')

            ifconfig['ip4s'] = ip4s
            ifconfig['ip6s'] = ip6s

            ifconfig['gateway4'] = gateway4
            ifconfig['gateway6'] = gateway6

            # Routes are optional
            routes = interface.get('routes', [])

            # Validate and normalize routes
            for route in routes:
                if 'route' not in route:
                    raise RuntimeError("Missing 'route' key for route")
                if 'netmask' not in route:
                    raise RuntimeError("Missing 'netmask' key for route")
                if 'gateway' not in route:
                    raise RuntimeError("Missing 'gateway' key for route")

                # Rename 'route' to 'network' to be more specific
                route['network'] = route.pop('route')
                route['prefixlen'] = NETMASK_TO_PREFIXLEN[route['netmask']]

            ifconfig['routes'] = routes

            ifconfig['dns'] = interface.get('dns', [])

            config[ifname] = ifconfig

        # TODO: Should we fail if there isn't at least one gateway specified?
        #if not gateway4 and not gateway6:
        #    raise RuntimeError('No gateway found for public interface')

        return os_mod.network.configure_network(hostname, config)
dataset/ETHPy150Open rackerlabs/openstack-guest-agents-unix/commands/network.py/NetworkCommands.resetnetwork_cmd/swapped operands of `%`