docs: def read_topology(self):
          """
          Read the ini-style topology file using ConfigObj
  
          :return config: Topology parsed by :py:mod:`ConfigObj`
          :rtype: ConfigObj
          """
          configspec = resource_stream(__name__, 'configspec')
          try:
              handle = open(self._topology)
              handle.close()
              try:
                  config = ConfigObj(self._topology,
                                     configspec=configspec,
                                     raise_errors=True,
                                     list_values=False,
                                     encoding='utf-8')
              except SyntaxError:
                  logging.error('Error loading .net file')
                  sys.exit(1)
          except IOError:
              logging.error('Cannot open topology file')
              sys.exit(1)
  
          vtor = Validator()
          res = config.validate(vtor, preserve_errors=True)
          if res:
              logging.debug('Validation passed')
          elif not res:
              for entry in flatten_errors(config, res):
                  # each entry is a tuple
                  (section_list, key, error) = entry
                  if key is not None:
                      section_list.append(key)
                  else:
                      section_list.append('[missing section]')
                  section_string = ', '.join(section_list)
  
                  if error is False:
                      error = 'Missing value or section'
                  print(section_string, ' = ', error)
                  input('Press ENTER to continue')
                  sys.exit(1)
  
          configspec.close()
          return config