Пример #1
0
 def parse_default_services(self):
     # defaults from the CORE GUI
     self.default_services = {
         'router': ['zebra', 'OSPFv2', 'OSPFv3', 'IPForward'],
         'host': ['DefaultRoute', 'SSH'],
         'PC': [
             'DefaultRoute',
         ],
         'mdr': ['zebra', 'OSPFv3MDR', 'IPForward'],
     }
     default_services = xmlutils.get_first_child_by_tag_name(
         self.scenario, 'CORE:defaultservices')
     if not default_services:
         return
     for device in xmlutils.iter_children_with_name(default_services,
                                                    'device'):
         device_type = device.getAttribute('type')
         if not device_type:
             logger.warn(
                 'parse_default_services: no type attribute found for device'
             )
             continue
         services = []
         for service in xmlutils.iter_children_with_name(device, 'service'):
             name = service.getAttribute('name')
             if name:
                 services.append(str(name))
         self.default_services[device_type] = services
     # store default services for the session
     for t, s in self.default_services.iteritems():
         self.session.services.defaultservices[t] = s
         logger.info('default services for node type \'%s\' set to: %s' %
                     (t, s))
Пример #2
0
 def parse_default_services(self):
     # defaults from the CORE GUI
     self.default_services = {
         'router': ['zebra', 'OSPFv2', 'OSPFv3', 'IPForward'],
         'host': ['DefaultRoute', 'SSH'],
         'PC': ['DefaultRoute', ],
         'mdr': ['zebra', 'OSPFv3MDR', 'IPForward'],
     }
     default_services = xmlutils.get_first_child_by_tag_name(self.scenario, 'CORE:defaultservices')
     if not default_services:
         return
     for device in xmlutils.iter_children_with_name(default_services, 'device'):
         device_type = device.getAttribute('type')
         if not device_type:
             logger.warn('parse_default_services: no type attribute found for device')
             continue
         services = []
         for service in xmlutils.iter_children_with_name(device, 'service'):
             name = service.getAttribute('name')
             if name:
                 services.append(str(name))
         self.default_services[device_type] = services
     # store default services for the session
     for t, s in self.default_services.iteritems():
         self.session.services.default_services[t] = s
         logger.info('default services for node type \'%s\' set to: %s' % (t, s))
Пример #3
0
 def parse_addresses(self, interface):
     mac = []
     ipv4 = []
     ipv6 = []
     hostname = []
     for address in xmlutils.iter_children_with_name(interface, 'address'):
         addr_type = address.getAttribute('type')
         if not addr_type:
             msg = 'no type attribute found for address ' \
                   'in interface: \'%s\'' % interface.toxml('utf-8')
             logger.warn(msg)
             assert False  # XXX for testing
         addr_text = xmlutils.get_child_text_trim(address)
         if not addr_text:
             msg = 'no text found for address ' \
                   'in interface: \'%s\'' % interface.toxml('utf-8')
             logger.warn(msg)
             assert False  # XXX for testing
         if addr_type == 'mac':
             mac.append(addr_text)
         elif addr_type == 'IPv4':
             ipv4.append(addr_text)
         elif addr_type == 'IPv6':
             ipv6.append(addr_text)
         elif addr_type == 'hostname':
             hostname.append(addr_text)
         else:
             msg = 'skipping unknown address type \'%s\' in ' \
                   'interface: \'%s\'' % (addr_type, interface.toxml('utf-8'))
             logger.warn(msg)
             assert False  # XXX for testing
     return mac, ipv4, ipv6, hostname
Пример #4
0
 def parse_addresses(self, interface):
     mac = []
     ipv4 = []
     ipv6 = []
     hostname = []
     for address in xmlutils.iter_children_with_name(interface, 'address'):
         addr_type = address.getAttribute('type')
         if not addr_type:
             msg = 'no type attribute found for address ' \
                   'in interface: \'%s\'' % interface.toxml('utf-8')
             logger.warn(msg)
             assert False  # XXX for testing
         addr_text = xmlutils.get_child_text_trim(address)
         if not addr_text:
             msg = 'no text found for address ' \
                   'in interface: \'%s\'' % interface.toxml('utf-8')
             logger.warn(msg)
             assert False  # XXX for testing
         if addr_type == 'mac':
             mac.append(addr_text)
         elif addr_type == 'IPv4':
             ipv4.append(addr_text)
         elif addr_type == 'IPv6':
             ipv6.append(addr_text)
         elif addr_type == 'hostname':
             hostname.append(addr_text)
         else:
             msg = 'skipping unknown address type \'%s\' in ' \
                   'interface: \'%s\'' % (addr_type, interface.toxml('utf-8'))
             logger.warn(msg)
             assert False  # XXX for testing
     return mac, ipv4, ipv6, hostname
Пример #5
0
 def parse_device_services(self, services, node):
     """
     Use session.services manager to store service customizations
     before they are added to a node.
     """
     service_names = []
     for service in xmlutils.iter_children_with_name(services, 'service'):
         name = self.parse_device_service(service, node)
         if name:
             service_names.append(name)
     return '|'.join(service_names)
Пример #6
0
 def parse_device_services(self, services, node):
     """
     Use session.services manager to store service customizations
     before they are added to a node.
     """
     service_names = []
     for service in xmlutils.iter_children_with_name(services, 'service'):
         name = self.parse_device_service(service, node)
         if name:
             service_names.append(name)
     return '|'.join(service_names)
Пример #7
0
 def parse_session_hooks(self, session_config):
     """
     Parse hook scripts.
     """
     hooks = xmlutils.get_first_child_by_tag_name(session_config, 'hooks')
     if not hooks:
         return
     for hook in xmlutils.iter_children_with_name(hooks, 'hook'):
         filename = hook.getAttribute('name')
         state = hook.getAttribute('state')
         data = xmlutils.get_child_text_trim(hook)
         if data is None:
             data = ''  # allow for empty file
         hook_type = "hook:%s" % state
         self.session.set_hook(hook_type, file_name=str(filename), source_name=None, data=str(data))
Пример #8
0
 def parse_parameter_children(cls, parent):
     params = {}
     for parameter in xmlutils.iter_children_with_name(parent, 'parameter'):
         param_name = parameter.getAttribute('name')
         assert param_name  # XXX for testing
         if not param_name:
             continue
         # TODO: consider supporting unicode; for now convert
         # to an ascii string
         param_name = str(param_name)
         param_val = cls.parse_xml_value(xmlutils.get_child_text_trim(parameter))
         # TODO: check if the name already exists?
         if param_name and param_val:
             params[param_name] = param_val
     return params
Пример #9
0
 def parse_parameter_children(cls, parent):
     params = {}
     for parameter in xmlutils.iter_children_with_name(parent, 'parameter'):
         param_name = parameter.getAttribute('name')
         assert param_name  # XXX for testing
         if not param_name:
             continue
         # TODO: consider supporting unicode; for now convert
         # to an ascii string
         param_name = str(param_name)
         param_val = cls.parse_xml_value(xmlutils.get_child_text_trim(parameter))
         # TODO: check if the name already exists?
         if param_name and param_val:
             params[param_name] = param_val
     return params
Пример #10
0
 def parse_session_hooks(self, session_config):
     """
     Parse hook scripts.
     """
     hooks = xmlutils.get_first_child_by_tag_name(session_config, 'hooks')
     if not hooks:
         return
     for hook in xmlutils.iter_children_with_name(hooks, 'hook'):
         filename = hook.getAttribute('name')
         state = hook.getAttribute('state')
         data = xmlutils.get_child_text_trim(hook)
         if data is None:
             data = ''  # allow for empty file
         hook_type = "hook:%s" % state
         self.session.set_hook(hook_type, file_name=str(filename), source_name=None, data=str(data))
Пример #11
0
    def parse_layer3_device(self, device):
        objid, device_name = self.get_common_attributes(device)
        logger.info('parsing layer-3 device: name=%s id=%s', device_name, objid)

        try:
            return self.session.get_object(objid)
        except KeyError:
            logger.exception("error getting session object: %s", objid)

        device_cls = self.nodecls
        core_node_type = self.core_node_type(device)
        n = self.create_core_object(device_cls, objid, device_name, device, core_node_type)
        n.type = core_node_type
        self.add_device_services(n, device, core_node_type)
        for interface in xmlutils.iter_children_with_name(device, 'interface'):
            self.parse_interface(n, device.getAttribute('id'), interface)
        return n
Пример #12
0
    def parse_layer3_device(self, device):
        objid, device_name = self.get_common_attributes(device)
        logger.info('parsing layer-3 device: name=%s id=%s', device_name, objid)

        try:
            return self.session.get_object(objid)
        except KeyError:
            logger.exception("error getting session object: %s", objid)

        device_cls = self.nodecls
        core_node_type = self.core_node_type(device)
        n = self.create_core_object(device_cls, objid, device_name, device, core_node_type)
        n.type = core_node_type
        self.add_device_services(n, device, core_node_type)
        for interface in xmlutils.iter_children_with_name(device, 'interface'):
            self.parse_interface(n, device.getAttribute('id'), interface)
        return n
Пример #13
0
 def set_object_presentation(self, obj, element, node_type):
     # defaults from the CORE GUI
     default_icons = {
         'router': 'router.gif',
         'host': 'host.gif',
         'PC': 'pc.gif',
         'mdr': 'mdr.gif',
     }
     icon_set = False
     for child in xmlutils.iter_children_with_name(element, 'CORE:presentation'):
         canvas = child.getAttribute('canvas')
         if canvas:
             obj.canvas = int(canvas)
         icon = child.getAttribute('icon')
         if icon:
             icon = str(icon).replace("$CORE_DATA_DIR",
                                      constants.CORE_DATA_DIR)
             obj.icon = icon
             icon_set = True
     if not icon_set and node_type in default_icons:
         obj.icon = default_icons[node_type]
Пример #14
0
 def set_object_presentation(self, obj, element, node_type):
     # defaults from the CORE GUI
     default_icons = {
         'router': 'router.gif',
         'host': 'host.gif',
         'PC': 'pc.gif',
         'mdr': 'mdr.gif',
     }
     icon_set = False
     for child in xmlutils.iter_children_with_name(element, 'CORE:presentation'):
         canvas = child.getAttribute('canvas')
         if canvas:
             obj.canvas = int(canvas)
         icon = child.getAttribute('icon')
         if icon:
             icon = str(icon).replace("$CORE_DATA_DIR",
                                      constants.CORE_DATA_DIR)
             obj.icon = icon
             icon_set = True
     if not icon_set and node_type in default_icons:
         obj.icon = default_icons[node_type]
Пример #15
0
    def parse_network(self, network):
        """
        Each network element should have an 'id' and 'name' attribute
        and include the following child elements:

            type	(one)
            member	(zero or more with type="interface" or type="channel")
            channel	(zero or more)
        """
        layer2_members = set()
        layer3_members = 0
        for dev, if_name in self.iter_network_member_devices(network):
            if not dev:
                continue
            devtype = self.device_type(dev)
            if devtype in self.layer2_device_types:
                layer2_members.add(dev)
            elif devtype in self.layer3_device_types:
                layer3_members += 1
            else:
                raise NotImplementedError

        if len(layer2_members) == 0:
            net_type = xmlutils.get_first_child_text_trim_by_tag_name(
                network, 'type')
            if not net_type:
                logger.warn('no network type found for network: \'%s\'',
                            network.toxml('utf-8'))
                assert False  # XXX for testing
            net_cls = self.network_class(network, net_type)
            objid, net_name = self.get_common_attributes(network)
            logger.info('parsing network: name=%s id=%s' % (net_name, objid))
            if objid in self.session.objects:
                return
            n = self.create_core_object(net_cls, objid, net_name, network,
                                        None)

        # handle channel parameters
        for channel in xmlutils.iter_children_with_name(network, 'channel'):
            self.parse_network_channel(channel)
Пример #16
0
    def parse_network(self, network):
        """
        Each network element should have an 'id' and 'name' attribute
        and include the following child elements:

            type	(one)
            member	(zero or more with type="interface" or type="channel")
            channel	(zero or more)
        """
        layer2_members = set()
        layer3_members = 0
        for dev, if_name in self.iter_network_member_devices(network):
            if not dev:
                continue
            devtype = self.device_type(dev)
            if devtype in self.layer2_device_types:
                layer2_members.add(dev)
            elif devtype in self.layer3_device_types:
                layer3_members += 1
            else:
                raise NotImplementedError

        if len(layer2_members) == 0:
            net_type = xmlutils.get_first_child_text_trim_by_tag_name(network, 'type')
            if not net_type:
                logger.warn('no network type found for network: \'%s\'', network.toxml('utf-8'))
                assert False  # XXX for testing
            net_cls = self.network_class(network, net_type)
            objid, net_name = self.get_common_attributes(network)
            logger.info('parsing network: name=%s id=%s' % (net_name, objid))
            if objid in self.session.objects:
                return
            n = self.create_core_object(net_cls, objid, net_name, network, None)

        # handle channel parameters
        for channel in xmlutils.iter_children_with_name(network, 'channel'):
            self.parse_network_channel(channel)
Пример #17
0
    def parse_device_service(self, service, node):
        name = service.getAttribute('name')
        session_service = ServiceManager.get(name)
        if not session_service:
            assert False  # XXX for testing
        values = []
        startup_idx = service.getAttribute('startup_idx')
        if startup_idx:
            values.append('startidx=%s' % startup_idx)
        startup_time = service.getAttribute('start_time')
        if startup_time:
            values.append('starttime=%s' % startup_time)
        dirs = []
        for directory in xmlutils.iter_children_with_name(service, 'directory'):
            dirname = directory.getAttribute('name')
            dirs.append(str(dirname))
        if dirs:
            values.append("dirs=%s" % dirs)
        startup = []
        shutdown = []
        validate = []
        for command in xmlutils.iter_children_with_name(service, 'command'):
            command_type = command.getAttribute('type')
            command_text = xmlutils.get_child_text_trim(command)
            if not command_text:
                continue
            if command_type == 'start':
                startup.append(str(command_text))
            elif command_type == 'stop':
                shutdown.append(str(command_text))
            elif command_type == 'validate':
                validate.append(str(command_text))
        if startup:
            values.append('cmdup=%s' % startup)
        if shutdown:
            values.append('cmddown=%s' % shutdown)
        if validate:
            values.append('cmdval=%s' % validate)

        filenames = []
        files = []
        for f in xmlutils.iter_children_with_name(service, 'file'):
            filename = f.getAttribute('name')
            if not filename:
                continue
            filenames.append(filename)
            data = xmlutils.get_child_text_trim(f)
            if data:
                data = str(data)
            else:
                data = None
            typestr = 'service:%s:%s' % (name, filename)
            files.append((typestr, filename, data))

        if filenames:
            values.append('files=%s' % filenames)

        custom = service.getAttribute('custom')
        if custom and custom.lower() == 'true':
            self.session.services.set_service(node.objid, session_service.name)
            values = ConfigShim.str_to_dict("|".join(values))
            for key, value in values.iteritems():
                ServiceShim.setvalue(session_service, key, value)

        # NOTE: if a custom service is used, setservicefile() must be
        # called after the custom service exists
        for typestr, filename, data in files:
            svcname = typestr.split(":")[1]
            self.session.services.set_service_file(
                node_id=node.objid,
                service_name=svcname,
                file_name=filename,
                data=data
            )
        return str(name)
Пример #18
0
 def parse_device_service(self, service, node):
     name = service.getAttribute('name')
     session_service = ServiceManager.get(name)
     if not session_service:
         assert False  # XXX for testing
     values = []
     startup_idx = service.getAttribute('startup_idx')
     if startup_idx:
         values.append('startidx=%s' % startup_idx)
     startup_time = service.getAttribute('start_time')
     if startup_time:
         values.append('starttime=%s' % startup_time)
     dirs = []
     for directory in xmlutils.iter_children_with_name(
             service, 'directory'):
         dirname = directory.getAttribute('name')
         dirs.append(str(dirname))
     if dirs:
         values.append("dirs=%s" % dirs)
     startup = []
     shutdown = []
     validate = []
     for command in xmlutils.iter_children_with_name(service, 'command'):
         command_type = command.getAttribute('type')
         command_text = xmlutils.get_child_text_trim(command)
         if not command_text:
             continue
         if command_type == 'start':
             startup.append(str(command_text))
         elif command_type == 'stop':
             shutdown.append(str(command_text))
         elif command_type == 'validate':
             validate.append(str(command_text))
     if startup:
         values.append('cmdup=%s' % startup)
     if shutdown:
         values.append('cmddown=%s' % shutdown)
     if validate:
         values.append('cmdval=%s' % validate)
     filenames = []
     files = []
     for f in xmlutils.iter_children_with_name(service, 'file'):
         filename = f.getAttribute('name')
         if not filename:
             continue
         filenames.append(filename)
         data = xmlutils.get_child_text_trim(f)
         if data:
             data = str(data)
         else:
             data = None
         typestr = 'service:%s:%s' % (name, filename)
         files.append((typestr, filename, data))
     if filenames:
         values.append('files=%s' % filenames)
     custom = service.getAttribute('custom')
     if custom and custom.lower() == 'true':
         self.session.services.setcustomservice(node.objid, session_service,
                                                values)
     # NOTE: if a custom service is used, setservicefile() must be
     # called after the custom service exists
     for typestr, filename, data in files:
         self.session.services.setservicefile(nodenum=node.objid,
                                              type=typestr,
                                              filename=filename,
                                              srcname=None,
                                              data=data)
     return str(name)