rob05c commented on a change in pull request #3688: Add TO Go remap.config
URL: https://github.com/apache/trafficcontrol/pull/3688#discussion_r329265275
##########
File path: traffic_ops/traffic_ops_golang/ats/db.go
##########
@@ -197,3 +346,428 @@ WHERE
}
return params, nil
}
+
+func GetServerParamData(tx *sql.Tx, profileID int, configFile string,
serverHost string, serverDomain string) (map[string]string, error) {
+ qry := `
+SELECT
+ p.id,
+ p.name,
+ p.value
+FROM
+ parameter p
+ join profile_parameter pp on p.id = pp.parameter
+ JOIN profile pr on p.id = pp.profile
+WHERE
+ pr.id = $1
+ AND p.config_file = $2
+`
+ rows, err := tx.Query(qry, profileID, configFile)
+ if err != nil {
+ return nil, errors.New("querying: " + err.Error())
+ }
+ defer rows.Close()
+
+ params := map[string]string{}
+ for rows.Next() {
+ id := 0
+ name := ""
+ val := ""
+ if err := rows.Scan(&name, &val); err != nil {
+ return nil, errors.New("scanning: " + err.Error())
+ }
+ if name == "location" {
+ continue
+ }
+
+ // some files have multiple lines with the same key... handle
that with param id.
+ key := name
+ if _, ok := params[name]; ok {
+ key += "__" + strconv.Itoa(id)
+ }
+ if val == "STRING __HOSTNAME__" {
+ val = serverHost + "." + serverDomain
+ }
+ params[key] = val
+ }
+ return params, nil
+}
+
+type DSData struct {
+ Type tc.DSType
+ OriginFQDN *string
+}
+
+func GetDSData(tx *sql.Tx, serverID int) ([]DSData, error) {
+ qry := `
+SELECT
+ dstype.name AS ds_type,
+ (SELECT o.protocol::text || \'://\' || o.fqdn || rtrim(concat(\':\',
o.port::text), \':\')
+ FROM origin o
+ WHERE o.deliveryservice = ds.id
+ AND o.is_primary) as org_server_fqdn
+FROM
+ deliveryservice ds
+ JOIN type as dstype ON ds.type = dstype.id
+WHERE
+ ds.id IN (
+ SELECT DISTINCT deliveryservice
+ FROM deliveryservice_server
+ WHERE server = $1
+ )
+`
+ rows, err := tx.Query(qry, serverID)
+ if err != nil {
+ return nil, errors.New("querying: " + err.Error())
+ }
+ defer rows.Close()
+
+ dses := []DSData{}
+ for rows.Next() {
+ d := DSData{}
+ if err := rows.Scan(&d.Type, &d.OriginFQDN); err != nil {
+ return nil, errors.New("scanning: " + err.Error())
+ }
+ d.Type = tc.DSTypeFromString(string(d.Type))
+ dses = append(dses, d)
+ }
+ return dses, nil
+}
+
+func GetRemapDSData(tx *sql.Tx, serverInfo *atscfg.ServerInfo)
([]atscfg.RemapConfigDSData, error) {
+ if tc.CacheTypeFromString(serverInfo.Type) == tc.CacheTypeMid {
+ return GetRemapDSDataForMid(tx, serverInfo)
+ } else {
+ return GetRemapDSDataForEdge(tx, serverInfo)
+ }
+}
+
+const RemapDSDataQuerySelectFrom = `
+SELECT
+ ds.xml_id,
+ ds.id AS ds_id,
+ ds.dscp,
+ ds.routing_name,
+ ds.signing_algorithm,
+ ds.qstring_ignore,
+ (SELECT o.protocol::text || '://' || o.fqdn || rtrim(concat(':',
o.port::text), ':')
+ FROM origin o
+ WHERE o.deliveryservice = ds.id
+ AND o.is_primary) as org_server_fqdn,
+ ds.multi_site_origin,
+ ds.range_request_handling,
+ ds.fq_pacing_rate,
+ ds.origin_shield,
+ r.pattern,
+ retype.name AS re_type,
+ dstype.name AS ds_type,
+ cdn.domain_name AS domain_name,
+ dsr.set_number,
+ ds.edge_header_rewrite,
+ ds.mid_header_rewrite,
+ ds.regex_remap,
+ ds.cacheurl,
+ ds.remap_text,
+ ds.protocol,
+ ds.profile,
+ ds.anonymous_blocking_enabled,
+ ds.active
+FROM
+ deliveryservice ds
+ JOIN deliveryservice_regex dsr ON dsr.deliveryservice = ds.id
+ JOIN regex r ON dsr.regex = r.id
+ JOIN type retype ON r.type = retype.id
+ JOIN type dstype ON ds.type = dstype.id
+ JOIN cdn ON cdn.id = ds.cdn_id
+`
+
+const RemapDSDataQueryWhereForMid = `
+WHERE
+ cdn.name = $1
+ AND ds.id in (SELECT dss.deliveryservice FROM deliveryservice_server dss)
+ AND ds.active = true
+`
+
+const RemapDSDataQueryWhereForEdge = `
+JOIN deliveryservice_server dss ON dss.deliveryservice = ds.id
+WHERE dss.server = $1
+`
+
+const RemapDSDataQueryOrderBy = `
+ORDER BY
+ ds_id,
+ re_type,
+ set_number
+`
+
+func GetRemapDSDataForMid(tx *sql.Tx, serverInfo *atscfg.ServerInfo)
([]atscfg.RemapConfigDSData, error) {
+ qry := RemapDSDataQuerySelectFrom + RemapDSDataQueryWhereForMid +
RemapDSDataQueryOrderBy
+ rows, err := tx.Query(qry, serverInfo.CDN)
+ if err != nil {
+ return nil, errors.New("querying: " + err.Error())
+ }
+ defer rows.Close()
+
+ dses := []atscfg.RemapConfigDSData{}
+ for rows.Next() {
+ d := atscfg.RemapConfigDSData{}
+ if err := rows.Scan(&d.Name, &d.ID, &d.DSCP, &d.RoutingName,
&d.SigningAlgorithm, &d.QStringIgnore, &d.OriginFQDN, &d.MultiSiteOrigin,
&d.RangeRequestHandling, &d.FQPacingRate, &d.OriginShield, &d.Pattern,
&d.RegexType, &d.Type, &d.Domain, &d.RegexSetNumber, &d.EdgeHeaderRewrite,
&d.MidHeaderRewrite, &d.RegexRemap, &d.CacheURL, &d.RemapText, &d.Protocol,
&d.ProfileID, &d.AnonymousBlockingEnabled, &d.Active); err != nil {
+ return nil, errors.New("scanning: " + err.Error())
+ }
+ if !RemapDotConfigIncludeInactiveDeliveryServices && !d.Active {
+ continue
+ }
+ d.Type = tc.DSTypeFromString(string(d.Type))
+ dses = append(dses, d)
+ }
+ return dses, nil
+}
+
+func GetRemapDSDataForEdge(tx *sql.Tx, server *atscfg.ServerInfo)
([]atscfg.RemapConfigDSData, error) {
+ qry := RemapDSDataQuerySelectFrom + RemapDSDataQueryWhereForEdge +
RemapDSDataQueryOrderBy
+ rows, err := tx.Query(qry, server.ID)
+ if err != nil {
+ return nil, errors.New("querying: " + err.Error())
+ }
+ defer rows.Close()
+
+ dses := []atscfg.RemapConfigDSData{}
+ for rows.Next() {
+ d := atscfg.RemapConfigDSData{}
+ if err := rows.Scan(&d.Name, &d.ID, &d.DSCP, &d.RoutingName,
&d.SigningAlgorithm, &d.QStringIgnore, &d.OriginFQDN, &d.MultiSiteOrigin,
&d.RangeRequestHandling, &d.FQPacingRate, &d.OriginShield, &d.Pattern,
&d.RegexType, &d.Type, &d.Domain, &d.RegexSetNumber, &d.EdgeHeaderRewrite,
&d.MidHeaderRewrite, &d.RegexRemap, &d.CacheURL, &d.RemapText, &d.Protocol,
&d.ProfileID, &d.AnonymousBlockingEnabled, &d.Active); err != nil {
+ return nil, errors.New("scanning: " + err.Error())
+ }
+ if !RemapDotConfigIncludeInactiveDeliveryServices && !d.Active {
+ continue
+ }
+ d.Type = tc.DSTypeFromString(string(d.Type))
+ dses = append(dses, d)
+ }
+ return dses, nil
+}
+
+func GetServerNameFromID(tx *sql.Tx, id int) (tc.CacheName, bool, error) {
+ qry := `SELECT s.host_name FROM server s WHERE s.id = $1`
+ name := tc.CacheName("")
+ if err := tx.QueryRow(qry, id).Scan(&name); err != nil {
+ if err == sql.ErrNoRows {
+ return "", false, nil
+ }
+ return "", false, errors.New("querying: " + err.Error())
+ }
+ return name, true, nil
+}
+
+// getServerNameFromNameOrID returns the server name from a parameter which
may be the name or ID.
+// This also checks and verifies the existence of the given server, and
returns an appropriate user error if it doesn't exist.
+// Returns the name, any user error, any system error, and any error code.
+func GetServerNameFromNameOrID(tx *sql.Tx, serverNameOrID string)
(tc.CacheName, error, error, int) {
Review comment:
Yeah, funcs I renamed and didn't fix the comment. I'll fix.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services