func getDetailServers()

in traffic_ops/traffic_ops_golang/server/detail.go [187:362]


func getDetailServers(tx *sql.Tx, user *auth.CurrentUser, hostName string, physLocationID int, orderBy string, limit int, reqVersion api.Version) ([]tc.ServerDetailV40, error) {
	allowedOrderByCols := map[string]string{
		"":                "",
		"cachegroup":      "server.cachegroup",
		"cdn_name":        "cdn.name",
		"domain_name":     "server.domain_name",
		"guid":            "server.guid",
		"host_name":       "server.host_name",
		"https_port":      "server.https_port",
		"id":              "server.id",
		"ilo_ip_address":  "server.ilo_ip_address",
		"ilo_ip_gateway":  "server.ilo_ip_gateway",
		"ilo_ip_netmask":  "server.ilo_ip_netmask",
		"ilo_password":    "server.ilo_password",
		"ilo_username":    "server.ilo_username",
		"mgmt_ip_address": "server.mgmt_ip_address",
		"mgmt_ip_gateway": "server.mgmt_ip_gateway",
		"mgmt_ip_netmask": "server.mgmt_ip_netmask",
		"offline_reason":  "server.offline_reason",
		"phys_location":   "pl.name",
		"profile":         "p.name",
		"profile_desc":    "p.description",
		"rack":            "server.rack",
		"status":          "st.name",
		"tcp_port":        "server.tcp_port",
		"server_type":     "t.name",
		"xmpp_id":         "server.xmpp_id",
		"xmpp_passwd":     "server.xmpp_passwd",
	}
	orderBy, ok := allowedOrderByCols[orderBy]
	if !ok {
		return nil, errors.New("orderBy '" + orderBy + "' not permitted")
	}

	queryFormatString := `
SELECT
	server.id
	%v
FROM server
JOIN cachegroup cg ON server.cachegroup = cg.id
JOIN cdn ON server.cdn_id = cdn.id
JOIN phys_location pl ON server.phys_location = pl.id
JOIN profile p ON server.profile = p.id
JOIN status st ON server.status = st.id
JOIN type t ON server.type = t.id
`
	limitStr := ""
	if limit != 0 {
		limitStr = " LIMIT " + strconv.Itoa(limit)
	}
	orderByStr := ""
	if orderBy != "" {
		orderByStr = " ORDER BY " + orderBy
	}
	idRows, err := AddWhereClauseAndQuery(tx, fmt.Sprintf(queryFormatString, ""), hostName, physLocationID, orderByStr, limitStr)
	if err != nil {
		return nil, fmt.Errorf("querying delivery service eligible servers: %w", err)
	}
	defer log.Close(idRows, "getting IDs for server details names")
	var serverIDs []int
	for idRows.Next() {
		var serverID *int
		err := idRows.Scan(&serverID)
		if err != nil {
			return nil, fmt.Errorf("querying delivery service eligible server ids: %w", err)
		}
		serverIDs = append(serverIDs, *serverID)
	}
	serversMap, err := dbhelpers.GetServersInterfaces(serverIDs, tx)
	if err != nil {
		return nil, fmt.Errorf("unable to get server interfaces: %w", err)
	}
	rows, err := AddWhereClauseAndQuery(tx, fmt.Sprintf(queryFormatString, dataFetchQuery), hostName, physLocationID, orderByStr, limitStr)
	if err != nil {
		return nil, fmt.Errorf("querying detail servers: %w", err)
	}

	defer log.Close(rows, "getting server details data")
	sIDs := []int{}
	servers := []tc.ServerDetailV40{}

	serviceAddress := new(string)
	service6Address := new(string)
	serviceGateway := new(string)
	service6Gateway := new(string)
	serviceNetmask := new(string)
	serviceInterface := new(string)
	serviceMtu := new(string)

	for rows.Next() {
		s := tc.ServerDetailV40{}
		err = rows.Scan(
			&s.ID,
			&s.CacheGroup,
			&s.CDNName,
			pq.Array(&s.DeliveryServiceIDs),
			&s.DomainName,
			&s.GUID,
			&s.HostName,
			&s.HTTPSPort,
			&s.ILOIPAddress,
			&s.ILOIPGateway,
			&s.ILOIPNetmask,
			&s.ILOPassword,
			&s.ILOUsername,
			&serviceAddress,
			&service6Address,
			&serviceGateway,
			&service6Gateway,
			&serviceNetmask,
			&serviceInterface,
			&serviceMtu,
			&s.MgmtIPAddress,
			&s.MgmtIPGateway,
			&s.MgmtIPNetmask,
			&s.OfflineReason,
			&s.PhysLocation,
			pq.Array(&s.ProfileNames),
			&s.Rack,
			&s.Status,
			&s.TCPPort,
			&s.Type,
			&s.XMPPID,
			&s.XMPPPasswd,
		)
		if err != nil {
			return nil, fmt.Errorf("scanning detail server: %w", err)
		}
		s.ServerInterfaces = []tc.ServerInterfaceInfoV40{}
		if interfacesMap, ok := serversMap[*s.ID]; ok {
			for _, interfaceInfo := range interfacesMap {
				s.ServerInterfaces = append(s.ServerInterfaces, interfaceInfo)
			}
		}

		hiddenField := "********"
		if user.PrivLevel < auth.PrivLevelOperations {
			s.ILOPassword = &hiddenField
			s.XMPPPasswd = &hiddenField
		}

		servers = append(servers, s)
		sIDs = append(sIDs, *s.ID)
	}

	rows, err = tx.Query(`SELECT serverid, description, val from hwinfo where serverid = ANY($1);`, pq.Array(sIDs))
	if err != nil {
		return nil, fmt.Errorf("querying detail servers hardware info: %w", err)
	}
	defer log.Close(rows, "getting hwinfo data")
	hwInfos := map[int]map[string]string{}
	for rows.Next() {
		serverID := 0
		desc := ""
		val := ""
		if err := rows.Scan(&serverID, &desc, &val); err != nil {
			return nil, fmt.Errorf("scanning detail server hardware info: %w", err)
		}

		hwInfo, ok := hwInfos[serverID]
		if !ok {
			hwInfo = map[string]string{}
		}
		hwInfo[desc] = val
		hwInfos[serverID] = hwInfo
	}
	for i, server := range servers {
		hw, ok := hwInfos[*server.ID]
		if !ok {
			continue
		}
		server.HardwareInfo = hw
		servers[i] = server
	}
	return servers, nil
}