blob: 453270e7518da557a6a1ea717e4a47f76da8e16b [file] [log] [blame]
package tc
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// enum.go contains enumerations and strongly typed names.
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
)
// CDNName is the name of a CDN in Traffic Control.
type CDNName string
// TrafficMonitorName is the (short) hostname of a Traffic Monitor peer.
type TrafficMonitorName string
// String implements the fmt.Stringer interface.
func (t TrafficMonitorName) String() string {
return string(t)
}
// CacheName is the (short) hostname of a cache server.
type CacheName string
// String implements the fmt.Stringer interface.
func (c CacheName) String() string {
return string(c)
}
// CacheGroupName is the name of a Cache Group.
type CacheGroupName string
// DeliveryServiceName is the name of a Delivery Service.
//
// This has no attached semantics, and so it may be encountered in situations
// where it is the actual Display Name, but most often (as far as this author
// knows), it actually refers to a Delivery Service's XMLID.
type DeliveryServiceName string
// String implements the fmt.Stringer interface.
func (d DeliveryServiceName) String() string {
return string(d)
}
// TopologyName is the name of a Topology.
type TopologyName string
// CacheType is the type (or tier) of a cache server.
type CacheType string
// The allowable values for a CacheType.
const (
// CacheTypeEdge represents an edge-tier cache server.
CacheTypeEdge = CacheType("EDGE")
// CacheTypeMid represents a mid-tier cache server.
CacheTypeMid = CacheType("MID")
// CacheTypeInvalid represents an CacheType. Note this is the default
// construction for a CacheType.
CacheTypeInvalid = CacheType("")
)
// String returns a string representation of this CacheType, implementing the
// fmt.Stringer interface.
func (t CacheType) String() string {
switch t {
case CacheTypeEdge:
return "EDGE"
case CacheTypeMid:
return "MID"
default:
return "INVALIDCACHETYPE"
}
}
// CacheTypeFromString returns a CacheType structure from its string
// representation, or CacheTypeInvalid if the string is not a valid CacheType.
func CacheTypeFromString(s string) CacheType {
s = strings.ToLower(s)
if strings.HasPrefix(s, "edge") {
return CacheTypeEdge
}
if strings.HasPrefix(s, "mid") {
return CacheTypeMid
}
return CacheTypeInvalid
}
// IsValidCacheType returns true if the given string represents a valid cache type.
func IsValidCacheType(s string) bool {
return CacheTypeFromString(s) != CacheTypeInvalid
}
// InterfaceName is the name of a server interface.
type InterfaceName string
// OriginLocationType is the Name of a Cache Group which represents an
// "Origin Location".
//
// There is no enforcement in Traffic Control anywhere that ensures than an
// ORG_LOC-Type Cache Group will only actually contain Origin servers.
//
// Deprecated: Prefer CacheGroupOriginTypeName for consistency.
const OriginLocationType = "ORG_LOC"
// AlgorithmConsistentHash is the name of the Multi-Site Origin hashing
// algorithm that performs consistent hashing on a set of parents.
const AlgorithmConsistentHash = "consistent_hash"
// MonitorTypeName is the Name of the Type which must be assigned to a server
// for it to be treated as a Traffic Monitor instance by ATC.
//
// "Rascal" is a legacy name for Traffic Monitor.
//
// Note that there is, in general, no guarantee that a Type with this name
// exists in Traffic Ops at any given time.
const MonitorTypeName = "RASCAL"
// MonitorProfilePrefix is a prefix which MUST appear on the Names of Profiles
// used by Traffic Monitor instances as servers in Traffic Ops, or they may not
// be treated properly.
//
// "Rascal" is a legacy name for Traffic Monitor.
//
// Deprecated: This should not be a requirement for TM instances to be treated
// properly, and new code should not check this.
const MonitorProfilePrefix = "RASCAL"
// RouterTypeName is the Name of the Type which must be assigned to a server
// for it to be treated as a Traffic Router instance by ATC.
//
// "CCR" is an acronym for a legacy name for Traffic Router.
//
// Note that there is, in general, no guarantee that a Type with this name
// exists in Traffic Ops at any given time.
const RouterTypeName = "CCR"
// EdgeTypePrefix is a prefix which MUST appear on the Names of Types used by
// edge-tier cache servers in order for them to be recognized as edge-tier
// cache servers by ATC.
const EdgeTypePrefix = "EDGE"
// MidTypePrefix is a prefix which MUST appear on the Names of Types used by
// mid-tier cache servers in order for them to be recognized as mid-tier cache
// servers by ATC.
const MidTypePrefix = "MID"
// OriginTypeName is the Name of the Type which must be assigned to a server
// for it to be treated as an Origin server by ATC.
//
// Note that there is, in general, no guarantee that a Type with this name
// exists in Traffic Ops at any given time.
const OriginTypeName = "ORG"
// These are the Names of the Types that must be used by various kinds of Cache
// Groups to ensure proper behavior.
//
// Note that there is, in general, no guarantee that a Type with any of these
// names exist in Traffic Ops at any given time.
//
// Note also that there is no enforcement in Traffic Control that a particular
// Type of Cache Group contains only or any of a particular Type or Types of
// server(s).
const (
CacheGroupEdgeTypeName = EdgeTypePrefix + "_LOC"
CacheGroupMidTypeName = MidTypePrefix + "_LOC"
CacheGroupOriginTypeName = OriginTypeName + "_LOC"
)
// GlobalProfileName is the Name of a Profile that is treated specially in some
// respects by some components of ATC.
//
// Note that there is, in general, no guarantee that a Profile with this Name
// exists in Traffic Ops at any given time, nor that it will have or not have
// any particular set of assigned Parameters, nor that any set of Parameters
// that do happen to be assigned to it should it exist will have or not have
// particular ConfigFile or Secure or Value values, nor that any such
// Parameters should they exist would have Values that match any given pattern,
// nor that it has any particular Profile Type, nor that it is or is not
// assigned to any Delivery Service or server or server(s), nor that those
// servers be or not be of any particular Type should they exist. Traffic Ops
// promises much, but guarantees little.
const GlobalProfileName = "GLOBAL"
// ParameterName represents the name of a Traffic Ops Parameter.
//
// This has no additional attached semantics.
type ParameterName string
// UseRevalPendingParameterName is the name of a Parameter which tells whether
// or not Traffic Ops should use pending content invalidation jobs separately
// from traditionally "queued updates".
//
// Note that there is no guarantee that a Parameter with this name exists in
// Traffic Ops at any given time, nor that it will have or not have any
// particular ConfigFile or Secure or Value value, nor that should such a
// Parameter exist that its value will match or not match any given pattern,
// nor that it will or will not be assigned to any particular Profile or
// Profiles or Cache Groups.
//
// Deprecated: UseRevalPending was a feature flag introduced for ATC version 2,
// and newer code should just assume that pending revalidations are going to be
// fetched by t3c.
const UseRevalPendingParameterName = ParameterName("use_reval_pending")
// RefetchEnabled is the name of a Parameter used to determine if the
// Refetch feature is enabled. If enabled, this allows a consumer of the TO API
// to submit Refetch InvalidationJob types. These will subsequently be treated
// as a MISS by cache servers. Previously, the only capability was Refresh
// which was, in turn, treated as a STALE by cache servers. This value should
// be used with caution, since coupled with regex, could cause significant
// performance impacts by implementing cache servers if used incorrectly.
//
// Note that there is no guarantee that a Parameter with this name exists in
// Traffic Ops at any given time, and while it's implementation relies on
// a boolean Value, this it not gauranteed either.
const RefetchEnabled = ParameterName("refetch_enabled")
// ConfigFileName is a Parameter ConfigFile value.
//
// This has no additional attached semantics, and so while it is known to most
// frequently refer to a Parameter's ConfigFile, it may also be used to refer
// to the name of a literal configuration file within or without the context of
// Traffic Control, with unknown specificity (relative or absolute path?
// file:// URL?) and/or restrictions.
type ConfigFileName string
// GlobalConfigFileName is ConfigFile value which can cause a Parameter to be
// handled specially by Traffic Control components under certain circumstances.
//
// Note that there is no guarantee that a Parameter with this ConfigFile value
// exists in Traffic Ops at any given time, nor that any particular number of
// such Parameters is allowed or forbidden, nor that any such existing
// Parameters will have or not have any particular Name or Secure or Value
// value, nor that should such a Parameter exist that its value will match or
// not match any given pattern, nor that it will or will not be assigned to any
// particular Profile or Profiles or Cache Groups.
const GlobalConfigFileName = ConfigFileName("global")
// The allowed values for a Delivery Service's Query String Handling.
//
// These are prefixed "QueryStringIgnore" even though the values don't always
// indicate ignoring, because the database column is named "qstring_ignore".
const (
QueryStringIgnoreUseInCacheKeyAndPassUp = 0
QueryStringIgnoreIgnoreInCacheKeyAndPassUp = 1
QueryStringIgnoreDropAtEdge = 2
)
// The allowed values for a Delivery Service's Range Request Handling.
const (
RangeRequestHandlingDontCache = 0
RangeRequestHandlingBackgroundFetch = 1
RangeRequestHandlingCacheRangeRequest = 2
RangeRequestHandlingSlice = 3
)
// A DSTypeCategory defines the routing method for a Delivery Service, i.e.
// HTTP or DNS.
type DSTypeCategory string
const (
// DSTypeCategoryHTTP represents an HTTP-routed Delivery Service.
DSTypeCategoryHTTP = DSTypeCategory("http")
// DSTypeCategoryDNS represents a DNS-routed Delivery Service.
DSTypeCategoryDNS = DSTypeCategory("dns")
// DSTypeCategoryInvalid represents an invalid Delivery Service routing
// type. Note this is the default construction for a DSTypeCategory.
DSTypeCategoryInvalid = DSTypeCategory("")
)
// String returns a string representation of this DSTypeCategory, implementing
// the fmt.Stringer interface.
func (t DSTypeCategory) String() string {
switch t {
case DSTypeCategoryHTTP:
return "HTTP"
case DSTypeCategoryDNS:
return "DNS"
default:
return "INVALIDDSTYPE"
}
}
// DSTypeCategoryFromString returns a DSTypeCategory from its string
// representation, or DSTypeCategoryInvalid if the string is not a valid
// DSTypeCategory.
//
// This is cAsE-iNsEnSiTiVe.
func DSTypeCategoryFromString(s string) DSTypeCategory {
s = strings.ToLower(s)
switch s {
case "http":
return DSTypeCategoryHTTP
case "dns":
return DSTypeCategoryDNS
default:
return DSTypeCategoryInvalid
}
}
// GetDSTypeCategory returns the delivery service type category (either HTTP or DNS) of the given delivery service type.
func GetDSTypeCategory(dsType string) string {
if strings.HasPrefix(dsType, "DNS") {
return "DNS"
}
return "HTTP"
}
// These are the allowable values for the Signing Algorithm property of a
// Delivery Service.
const (
SigningAlgorithmURLSig = "url_sig"
SigningAlgorithmURISigning = "uri_signing"
)
// These are the allowable values for the Protocol property of a Delivery
// Service.
const (
// Indicates content will only be served using the unsecured HTTP Protocol.
DSProtocolHTTP = 0
// Indicates content will only be served using the secured HTTPS Protocol.
DSProtocolHTTPS = 1
// Indicates content will only be served over both HTTP and HTTPS.
DSProtocolHTTPAndHTTPS = 2
// Indicates content will only be served using the secured HTTPS Protocol,
// and that unsecured HTTP requests will be directed to use HTTPS instead.
DSProtocolHTTPToHTTPS = 3
)
// CacheStatus is a Name of some Status.
//
// More specifically, it is used here to enumerate the Statuses that are
// understood and acted upon in specific ways by Traffic Monitor.
//
// Note that the Statuses captured in this package as CacheStatus values are in
// no way restricted to use by cache servers, despite the name.
type CacheStatus string
// These are the allowable values of a CacheStatus.
//
// Note that there is no guarantee that a Status by any of these Names exists
// in Traffic Ops at any given time, nor that such a Status - should it exist
// - have any given Description or ID.
const (
// CacheStatusAdminDown represents a cache server which has been
// administratively marked as "down", but which should still appear in the
// CDN.
CacheStatusAdminDown = CacheStatus("ADMIN_DOWN")
// CacheStatusOnline represents a cache server which should always be
// considered online/available/healthy, irrespective of monitoring.
// Non-cache servers also typically use this Status instead of REPORTED.
CacheStatusOnline = CacheStatus("ONLINE")
// CacheStatusOffline represents a cache server which should always be
// considered offline/unavailable/unhealthy, irrespective of monitoring.
CacheStatusOffline = CacheStatus("OFFLINE")
// CacheStatusReported represents a cache server which is polled for health
// by Traffic Monitor. The vast majority of cache servers should have this
// Status.
CacheStatusReported = CacheStatus("REPORTED")
// CacheStatusPreProd represents a cache server that is not deployed to "production",
// but is ready for it.
CacheStatusPreProd = CacheStatus("PRE_PROD")
// CacheStatusInvalid represents an unrecognized Status value. Note that
// this is not actually "invalid", because Statuses may have any unique
// name, not just those captured as CacheStatus values in this package.
CacheStatusInvalid = CacheStatus("")
)
// String returns a string representation of this CacheStatus, implementing the
// fmt.Stringer interface.
func (t CacheStatus) String() string {
switch t {
case CacheStatusAdminDown:
fallthrough
case CacheStatusOnline:
fallthrough
case CacheStatusOffline:
fallthrough
case CacheStatusReported:
return string(t)
default:
return "INVALIDCACHESTATUS"
}
}
// CacheStatusFromString returns a CacheStatus from its string representation,
// or CacheStatusInvalid if the string is not a valid CacheStatus.
func CacheStatusFromString(s string) CacheStatus {
s = strings.ToLower(s)
switch s {
case "admin_down":
fallthrough
case "admindown":
return CacheStatusAdminDown
case "offline":
return CacheStatusOffline
case "online":
return CacheStatusOnline
case "reported":
return CacheStatusReported
default:
return CacheStatusInvalid
}
}
// Protocol represents an ATC-supported content delivery protocol.
//
// Deprecated: This does not accurately model the Protocol of a Delivery
// Service, use DSProtocolHTTP, DSProtocolHTTPS, DSProtocolHTTPToHTTPS, and
// DSProtocolHTTPAndHTTPS instead.
type Protocol string
// The allowable values of a Protocol.
//
// Deprecated: These do not accurately model the Protocol of a Delivery
// Service, use DSProtocolHTTP, DSProtocolHTTPS, DSProtocolHTTPToHTTPS, and
// DSProtocolHTTPAndHTTPS instead.
const (
// ProtocolHTTP represents the HTTP/1.1 protocol as specified in RFC2616.
ProtocolHTTP = Protocol("http")
// ProtocolHTTPS represents the HTTP/1.1 protocol over a TCP connection secured by TLS.
ProtocolHTTPS = Protocol("https")
// ProtocolHTTPtoHTTPS represents a redirection of unsecured HTTP requests to HTTPS.
ProtocolHTTPtoHTTPS = Protocol("http to https")
// ProtocolHTTPandHTTPS represents the use of both HTTP and HTTPS.
ProtocolHTTPandHTTPS = Protocol("http and https")
// ProtocolInvalid represents an invalid Protocol.
ProtocolInvalid = Protocol("")
)
// String implements the fmt.Stringer interface.
func (p Protocol) String() string {
switch p {
case ProtocolHTTP:
fallthrough
case ProtocolHTTPS:
fallthrough
case ProtocolHTTPtoHTTPS:
fallthrough
case ProtocolHTTPandHTTPS:
return string(p)
default:
return "INVALIDPROTOCOL"
}
}
// ProtocolFromString parses a string and returns the corresponding Protocol.
func ProtocolFromString(s string) Protocol {
switch strings.Replace(strings.ToLower(s), "_", " ", -1) {
case "http":
return ProtocolHTTP
case "https":
return ProtocolHTTPS
case "http to https":
return ProtocolHTTPtoHTTPS
case "http and https":
return ProtocolHTTPandHTTPS
default:
return ProtocolInvalid
}
}
// UnmarshalJSON implements the encoding/json.Unmarshaler interface.
func (p *Protocol) UnmarshalJSON(data []byte) error {
if string(data) == "null" {
return errors.New("Protocol cannot be null")
}
s, err := strconv.Unquote(string(data))
if err != nil {
return fmt.Errorf("JSON %s not quoted: %v", data, err)
}
*p = ProtocolFromString(s)
if *p == ProtocolInvalid {
return fmt.Errorf("%s is not a (supported) Protocol", s)
}
return nil
}
// MarshalJSON implements the encoding/json.Marshaler interface.
func (p Protocol) MarshalJSON() ([]byte, error) {
return json.Marshal(p.String())
}
// LocalizationMethod represents an enabled localization method for a Cache
// Group. The string values of this type should match the Traffic Ops values.
type LocalizationMethod string
// These are the allowable values of a LocalizationMethod.
const (
LocalizationMethodCZ = LocalizationMethod("CZ")
LocalizationMethodDeepCZ = LocalizationMethod("DEEP_CZ")
LocalizationMethodGeo = LocalizationMethod("GEO")
LocalizationMethodInvalid = LocalizationMethod("INVALID")
)
// String returns a string representation of this LocalizationMethod,
// implementing the fmt.Stringer interface.
func (m LocalizationMethod) String() string {
switch m {
case LocalizationMethodCZ:
return string(m)
case LocalizationMethodDeepCZ:
return string(m)
case LocalizationMethodGeo:
return string(m)
default:
return "INVALID"
}
}
// LocalizationMethodFromString parses and returns a LocalizationMethod from
// its string representation.
//
// This is cAsE-iNsEnSiTiVe.
func LocalizationMethodFromString(s string) LocalizationMethod {
switch strings.ToLower(s) {
case "cz":
return LocalizationMethodCZ
case "deep_cz":
return LocalizationMethodDeepCZ
case "geo":
return LocalizationMethodGeo
default:
return LocalizationMethodInvalid
}
}
// UnmarshalJSON implements the encoding/json.Unmarshaler interface.
func (m *LocalizationMethod) UnmarshalJSON(data []byte) error {
if string(data) == "null" {
return errors.New("LocalizationMethod cannot be null")
}
s, err := strconv.Unquote(string(data))
if err != nil {
return errors.New(string(data) + " JSON not quoted")
}
*m = LocalizationMethodFromString(s)
if *m == LocalizationMethodInvalid {
return errors.New(s + " is not a LocalizationMethod")
}
return nil
}
// MarshalJSON implements the encoding/json.Marshaler interface.
func (m LocalizationMethod) MarshalJSON() ([]byte, error) {
return json.Marshal(m.String())
}
// Scan implements the database/sql.Scanner interface.
func (m *LocalizationMethod) Scan(value interface{}) error {
if value == nil {
return errors.New("LocalizationMethod cannot be null")
}
sv, err := driver.String.ConvertValue(value)
if err != nil {
return errors.New("failed to scan LocalizationMethod: " + err.Error())
}
switch v := sv.(type) {
case []byte:
*m = LocalizationMethodFromString(string(v))
if *m == LocalizationMethodInvalid {
return errors.New(string(v) + " is not a valid LocalizationMethod")
}
return nil
default:
return fmt.Errorf("failed to scan LocalizationMethod, unsupported input type: %T", value)
}
}
// DeepCachingType represents a Delivery Service's Deep Caching Type. The
// string values of this type should match the Traffic Ops values.
type DeepCachingType string
// These are the allowable values of a DeepCachingType. Note that unlike most
// "enumerated" constants exported by this package, the default construction
// yields a valid value.
const (
DeepCachingTypeNever = DeepCachingType("") // default value
DeepCachingTypeAlways = DeepCachingType("ALWAYS")
DeepCachingTypeInvalid = DeepCachingType("INVALID")
)
// String returns a string representation of this DeepCachingType, implementing
// the fmt.Stringer interface.
func (t DeepCachingType) String() string {
switch t {
case DeepCachingTypeAlways:
return string(t)
case DeepCachingTypeNever:
return "NEVER"
default:
return "INVALID"
}
}
// DeepCachingTypeFromString returns a DeepCachingType from its string
// representation, or DeepCachingTypeInvalid if the string is not a valid
// DeepCachingTypeFromString.
func DeepCachingTypeFromString(s string) DeepCachingType {
switch strings.ToLower(s) {
case "always":
return DeepCachingTypeAlways
case "never":
return DeepCachingTypeNever
case "":
// default when omitted
return DeepCachingTypeNever
default:
return DeepCachingTypeInvalid
}
}
// UnmarshalJSON unmarshals a JSON representation of a DeepCachingType (i.e. a
// string) or returns an error if the DeepCachingType is invalid.
//
// This implements the encoding/json.Unmarshaler interface.
func (t *DeepCachingType) UnmarshalJSON(data []byte) error {
if string(data) == "null" {
*t = DeepCachingTypeNever
return nil
}
s, err := strconv.Unquote(string(data))
if err != nil {
return errors.New(string(data) + " JSON not quoted")
}
*t = DeepCachingTypeFromString(s)
if *t == DeepCachingTypeInvalid {
return errors.New(string(data) + " is not a DeepCachingType")
}
return nil
}
// MarshalJSON marshals into a JSON representation, implementing the
// encoding/json.Marshaler interface.
func (t DeepCachingType) MarshalJSON() ([]byte, error) {
return json.Marshal(t.String())
}
// A SteeringType is the Name of the Type of a Steering Target.
type SteeringType string
// These are the allowable values of a SteeringType.
//
// Note that, in general, there is no guarantee that a Type by any of these
// Names exists in Traffic Ops at any given time, nor that any such Types
// - should they exist - will have any particular UseInTable value, nor that
// the Types assigned to Steering Target relationships will be representable
// by these values.
const (
SteeringTypeOrder SteeringType = "STEERING_ORDER"
SteeringTypeWeight SteeringType = "STEERING_WEIGHT"
SteeringTypeGeoOrder SteeringType = "STEERING_GEO_ORDER"
SteeringTypeGeoWeight SteeringType = "STEERING_GEO_WEIGHT"
SteeringTypeInvalid SteeringType = ""
)
// SteeringTypeFromString parses a string to return the corresponding
// SteeringType.
//
// Warning: This is cAsE-iNsEnSiTiVe, but some components of Traffic Ops may
// compare the Names of Steering Target Types in case-sensitive ways, so this
// may obscure values that will be later detected as invalid, depending on how
// it's used.
func SteeringTypeFromString(s string) SteeringType {
s = strings.ToLower(strings.Replace(s, "_", "", -1))
switch s {
case "steeringorder":
return SteeringTypeOrder
case "steeringweight":
return SteeringTypeWeight
case "steeringgeoorder":
return SteeringTypeGeoOrder
case "steeringgeoweight":
return SteeringTypeGeoWeight
default:
return SteeringTypeInvalid
}
}
// String returns a string representation of this SteeringType, implementing
// the fmt.Stringer interface.
func (t SteeringType) String() string {
switch t {
case SteeringTypeOrder:
fallthrough
case SteeringTypeWeight:
fallthrough
case SteeringTypeGeoOrder:
fallthrough
case SteeringTypeGeoWeight:
return string(t)
default:
return "INVALID"
}
}
// A FederationResolverType is the Name of a Type of a Federation Resolver
// Mapping.
type FederationResolverType string
// These are the allowable values of a FederationResolverType.
//
// Note that, in general, there is no guarantee that a Type by any of these
// Names exists in Traffic Ops at any given time, nor that any such Types
// - should they exist - will have any particular UseInTable value, nor that
// the Types assigned to Federation Resolver Mappings will be representable
// by these values.
const (
FederationResolverType4 = FederationResolverType("RESOLVE4")
FederationResolverType6 = FederationResolverType("RESOLVE6")
FederationResolverTypeInvalid = FederationResolverType("")
)
// String imlpements the fmt.Stringer interface.
func (t FederationResolverType) String() string {
switch t {
case FederationResolverType4:
fallthrough
case FederationResolverType6:
return string(t)
default:
return "INVALID"
}
}
// FederationResolverTypeFromString parses a string and returns the
// corresponding FederationResolverType.
func FederationResolverTypeFromString(s string) FederationResolverType {
switch strings.ToLower(s) {
case "resolve4":
return FederationResolverType4
case "resolve6":
return FederationResolverType6
default:
return FederationResolverTypeInvalid
}
}
// DSType is the Name of a Type used by a Delivery Service.
type DSType string
// These are the allowable values for a DSType.
//
// Note that, in general, there is no guarantee that a Type by any of these
// Names exists in Traffic Ops at any given time, nor that any such Types
// - should they exist - will have any particular UseInTable value, nor that
// the Types assigned to Delivery Services will be representable by these
// values.
const (
DSTypeClientSteering DSType = "CLIENT_STEERING"
DSTypeDNS DSType = "DNS"
DSTypeDNSLive DSType = "DNS_LIVE"
DSTypeDNSLiveNational DSType = "DNS_LIVE_NATNL"
DSTypeHTTP DSType = "HTTP"
DSTypeHTTPLive DSType = "HTTP_LIVE"
DSTypeHTTPLiveNational DSType = "HTTP_LIVE_NATNL"
DSTypeHTTPNoCache DSType = "HTTP_NO_CACHE"
DSTypeSteering DSType = "STEERING"
DSTypeAnyMap DSType = "ANY_MAP"
DSTypeInvalid DSType = ""
)
// String returns a string representation of this DSType, implementing the
// fmt.Stringer interface.
func (t DSType) String() string {
switch t {
case DSTypeHTTPNoCache:
fallthrough
case DSTypeDNS:
fallthrough
case DSTypeDNSLive:
fallthrough
case DSTypeHTTP:
fallthrough
case DSTypeDNSLiveNational:
fallthrough
case DSTypeAnyMap:
fallthrough
case DSTypeHTTPLive:
fallthrough
case DSTypeSteering:
fallthrough
case DSTypeHTTPLiveNational:
fallthrough
case DSTypeClientSteering:
return string(t)
default:
return "INVALID"
}
}
// DSTypeFromString returns a DSType from its string representation, or
// DSTypeInvalid if the string is not a valid DSType.
func DSTypeFromString(s string) DSType {
s = strings.ToLower(strings.Replace(s, "_", "", -1))
switch s {
case "httpnocache":
return DSTypeHTTPNoCache
case "dns":
return DSTypeDNS
case "dnslive":
return DSTypeDNSLive
case "http":
return DSTypeHTTP
case "dnslivenatnl":
return DSTypeDNSLiveNational
case "anymap":
return DSTypeAnyMap
case "httplive":
return DSTypeHTTPLive
case "steering":
return DSTypeSteering
case "httplivenatnl":
return DSTypeHTTPLiveNational
case "clientsteering":
return DSTypeClientSteering
default:
return DSTypeInvalid
}
}
// UsesDNSSECKeys returns whether a Delivery Service of a Type that has a Name
// that is this DSType uses or needs DNSSEC keys.
func (t DSType) UsesDNSSECKeys() bool {
return t.IsDNS() || t.IsHTTP() || t.IsSteering()
}
// IsHTTP returns whether a Delivery Service of a Type that has a Name
// that is this DSType is HTTP-routed.
func (t DSType) IsHTTP() bool {
switch t {
case DSTypeHTTP:
fallthrough
case DSTypeHTTPLive:
fallthrough
case DSTypeHTTPLiveNational:
fallthrough
case DSTypeHTTPNoCache:
return true
}
return false
}
// IsDNS returns whether a Delivery Service of a Type that has a Name
// that is this DSType is DNS-routed.
func (t DSType) IsDNS() bool {
switch t {
case DSTypeDNS:
fallthrough
case DSTypeDNSLive:
fallthrough
case DSTypeDNSLiveNational:
return true
}
return false
}
// IsSteering returns whether a Delivery Service of a Type that has a Name
// that is this DSType is Steering-routed.
func (t DSType) IsSteering() bool {
switch t {
case DSTypeSteering:
fallthrough
case DSTypeClientSteering:
return true
}
return false
}
// HasSSLKeys returns whether Dlivery Services of this Type can have SSL keys.
func (t DSType) HasSSLKeys() bool {
return t.IsHTTP() || t.IsDNS() || t.IsSteering()
}
// IsLive returns whether Delivery Services of this Type are "live".
func (t DSType) IsLive() bool {
switch t {
case DSTypeDNSLive:
fallthrough
case DSTypeDNSLiveNational:
fallthrough
case DSTypeHTTPLive:
fallthrough
case DSTypeHTTPLiveNational:
return true
}
return false
}
// IsNational returns whether Delivery Services of this Type are "national".
func (t DSType) IsNational() bool {
switch t {
case DSTypeDNSLiveNational:
fallthrough
case DSTypeHTTPLiveNational:
return true
}
return false
}
// UsesMidCache returns whether Delivery Services of this Type use mid-tier
// cache servers.
func (t DSType) UsesMidCache() bool {
switch t {
case DSTypeDNSLive:
fallthrough
case DSTypeHTTPLive:
fallthrough
case DSTypeHTTPNoCache:
return false
}
return true
}
// DSTypeLiveNationalSuffix is the suffix that Delivery Services which are both
// "live" and "national" MUST have at the end of the Name(s) of the Type(s)
// they use in order to be treated properly by ATC.
//
// Deprecated: Use DSType.IsLive and DSType.IsNational instead.
const DSTypeLiveNationalSuffix = "_LIVE_NATNL"
// DSTypeLiveSuffix is the suffix that Delivery Services which are "live" - but
// not "national" (maybe?) - MUST have at the end of the Name(s) of the Type(s)
// they use in order to be treated properly by ATC.
//
// Deprecated: Use DSType.IsLive and DSType.IsNational instead.
const DSTypeLiveSuffix = "_LIVE"
// A QStringIgnore defines how to treat the URL query string for requests
// for a given Delivery Service's content.
//
// This enum's String function returns the numeric representation, because it
// is a legacy database value, and the number should be kept for both database
// and API JSON uses. For the same reason, this enum has no FromString
// function.
//
// One should normally use the QueryStringIgnoreUseInCacheKeyAndPassUp,
// QueryStringIgnoreIgnoreInCacheKeyAndPassUp, and
// QueryStringIgnoreDropAtEdge constants instead, as they have the same type as
// the Delivery Service field they represent.
type QStringIgnore int
// These are the allowable values for a QStringIgnore.
const (
QStringIgnoreUseInCacheKeyAndPassUp QStringIgnore = 0
QStringIgnoreIgnoreInCacheKeyAndPassUp QStringIgnore = 1
QStringIgnoreDrop QStringIgnore = 2
)
// String returns the string number of the QStringIgnore value, implementing
// the fmt.Stringer interface.
//
// Note this returns the number, not a human-readable value, because
// QStringIgnore is a legacy database sigil, and both database and API JSON
// uses should use the number. This also returns 'INVALID' for unknown values,
// to fail fast in the event of bad data.
func (e QStringIgnore) String() string {
switch e {
case QStringIgnoreUseInCacheKeyAndPassUp:
fallthrough
case QStringIgnoreIgnoreInCacheKeyAndPassUp:
fallthrough
case QStringIgnoreDrop:
return strconv.Itoa(int(e))
default:
return "INVALID"
}
}
// A DSMatchType is the Name of a Type of a Regular Expression ("Regex") used
// by a Delivery Service.
type DSMatchType string
// These are the allowed values for a DSMatchType.
//
// Note that, in general, there is no guarantee that a Type by any of these
// Names exists in Traffic Ops at any given time, nor that any such Types
// - should they exist - will have any particular UseInTable value, nor that
// the Types assigned to Delivery Service Regexes will be representable
// by these values.
const (
DSMatchTypeHostRegex DSMatchType = "HOST_REGEXP"
DSMatchTypePathRegex DSMatchType = "PATH_REGEXP"
DSMatchTypeSteeringRegex DSMatchType = "STEERING_REGEXP"
DSMatchTypeHeaderRegex DSMatchType = "HEADER_REGEXP"
DSMatchTypeInvalid DSMatchType = ""
)
// String returns a string representation of this DSMatchType, implementing the
// fmt.Stringer interface.
func (t DSMatchType) String() string {
switch t {
case DSMatchTypeHostRegex:
fallthrough
case DSMatchTypePathRegex:
fallthrough
case DSMatchTypeSteeringRegex:
fallthrough
case DSMatchTypeHeaderRegex:
return string(t)
default:
return "INVALID_MATCH_TYPE"
}
}
// DSMatchTypeFromString returns a DSMatchType from its string representation,
// or DSMatchTypeInvalid if the string is not a valid type.
func DSMatchTypeFromString(s string) DSMatchType {
s = strings.ToLower(strings.Replace(s, "_", "", -1))
switch s {
case "hostregexp":
return DSMatchTypeHostRegex
case "pathregexp":
return DSMatchTypePathRegex
case "steeringregexp":
return DSMatchTypeSteeringRegex
case "headerregexp":
return DSMatchTypeHeaderRegex
default:
return DSMatchTypeInvalid
}
}