docs: def validate_network(network_id, template_id, scenario_id=None):
      """
          Given a network, scenario and template, ensure that all the nodes, links & groups
          in the network have the correct resource attributes as defined by the types in the template.
          Also ensure valid entries in tresourcetype.
          This validation will not fail if a resource has more than the required type, but will fail if
          it has fewer or if any attribute has a conflicting dimension or unit.
      """
  
      network = db.DBSession.query(Network).filter(Network.id==network_id).options(noload('scenarios')).first()
  
      if network is None:
          raise HydraError("Could not find network %s"%(network_id))
  
      resource_scenario_dict = {}
      if scenario_id is not None:
          scenario = db.DBSession.query(Scenario).filter(Scenario.id==scenario_id).first()
  
          if scenario is None:
              raise HydraError("Could not find scenario %s"%(scenario_id,))
  
          for rs in scenario.resourcescenarios:
              resource_scenario_dict[rs.resource_attr_id] = rs
  
      template = db.DBSession.query(Template).filter(Template.id == template_id).options(joinedload_all('templatetypes')).first()
  
      if template is None:
          raise HydraError("Could not find template %s"%(template_id,))
  
      resource_type_defs = {
          'NETWORK' : {},
          'NODE'    : {},
          'LINK'    : {},
          'GROUP'   : {},
      }
      for tt in template.templatetypes:
          resource_type_defs[tt.resource_type][tt.id] = tt
  
      errors = []
      #Only check if there are type definitions for a network in the template.
      if resource_type_defs.get('NETWORK'):
          net_types = resource_type_defs['NETWORK']
          errors.extend(_validate_resource(network, net_types, resource_scenario_dict))
  
      #check all nodes
      if resource_type_defs.get('NODE'):
          node_types = resource_type_defs['NODE']
          for node in network.nodes:
              errors.extend(_validate_resource(node, node_types, resource_scenario_dict))
  
      #check all links
      if resource_type_defs.get('LINK'):
          link_types = resource_type_defs['LINK']
          for link in network.links:
              errors.extend(_validate_resource(link, link_types, resource_scenario_dict))
  
      #check all groups
      if resource_type_defs.get('GROUP'):
          group_types = resource_type_defs['GROUP']
          for group in network.resourcegroups:
              errors.extend(_validate_resource(group, group_types, resource_scenario_dict))
  
      return errors