docs: def _generate_default_grp_constraints(roles, network_constraints):
      """Generate default symetric grp constraints.
      """
      default_delay = network_constraints.get('default_delay')
      default_rate = network_constraints.get('default_rate')
      default_loss = network_constraints.get('default_loss', 0)
      except_groups = network_constraints.get('except', [])
      grps = network_constraints.get('groups', roles.keys())
      # expand each groups
      grps = [expand_groups(g) for g in grps]
      # flatten
      grps = [x for expanded_group in grps for x in expanded_group]
      # building the default group constraints
      return [{'src': grp1,
               'dst': grp2,
               'delay': default_delay,
               'rate': default_rate,
               'loss': default_loss}
              for grp1 in grps for grp2 in grps
              if ((grp1 != grp2
                   or _src_equals_dst_in_constraints(network_constraints, grp1))
                  and grp1 not in except_groups and grp2 not in except_groups)]