| 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 |
| } |
| } |