Our APIs will be much easier to use, if we can stop exposing join tables to the API altogether (e.g. cachegroup_fallback, deliveryservice_regex), and only insert them into their proper objects (cachegroup, deliveryservice), and then manipulate them within the object via POST/PUT/PATCH on the larger object.
+1 on this strategy, we already applied a join table this way for roles and capabilities: https://github.com/apache/trafficcontrol/blob/master/traffic_ops/traffic_ops_golang/role/roles.go#L153 On 7/5/18, 9:49 AM, "Gray, Jonathan" <jonathan_g...@comcast.com> wrote: And to be clear, this applies only to cachegroups and not delivery services. Delivery services have a similar issue with "Deep Caching", "Geolocation Provider", & "Geo Miss Default Lat/Lon". - Jonathan On 7/5/18, 9:36 AM, "Eric Friedrich (efriedri)" <efrie...@cisco.com.INVALID> wrote: Would the “permissions” field be better titled as “localizationMethods” or “localizationPolicies"? Permissions typically relates to security and access control, so it seems a bit out of place here Also, should we consider adding the fallback list to the allowed localization methods/policies? This might allow us to remove the “fallbackToGeo” flag If a backup list is specified and geo-location is not allowed, that can be managed through this table rather than the one-off flag Definitely +1 to keep this extensible, as there will be more localization types in the future (Anycast, etc,… We at Cisco also have a network hops localization policy engine too, although its not open-sourced) —Eric > On Jul 5, 2018, at 11:24 AM, Robert Butts <robert.o.bu...@gmail.com> wrote: > > +1 on listing them as an array. JSON arrays are defined to be ordered, so > that lets us use the array order as the lookup order, making it easy to add > that as a feature in the future. > > -1 on array types in the database. It's unnecessary denormalization, and > will be harder to deal with in the future. We can do the same thing with a > normal join table: > > cg | localization | priority > ---------------------------- > foo | coverage_zone | 1 > foo | maxmind | 2 > foo | deep | 0 > bar | coverage_zone | 0 > > Which maps to the config `"permissions": [ "deep", "coverage-zone", > "geo"],` and also addresses your points on future types (we just add a new > enum value to the localization type). The additional `priority` column lets > us order it in the JSON array via SELECT ORDER BY. > > +1 on rethinking the cachegroup fallback API, too. We should have more join > tables, and better data normalization, but it's painful to use HTTP/JSON > APIs like that. Our APIs will be much easier to use, if we can stop > exposing join tables to the API altogether (e.g. cachegroup_fallback, > deliveryservice_regex), and only insert them into their proper objects > (cachegroup, deliveryservice), and then manipulate them within the object > via POST/PUT/PATCH on the larger object. > > > On Thu, Jul 5, 2018 at 9:23 AM, Mark Torluemke <mtorlue...@apache.org> > wrote: > >> Inline. >> >> On Thu, Jul 5, 2018 at 9:00 AM, Rawlin Peters <rawlin.pet...@gmail.com> >> wrote: >> >>> You're not mistaken, Jonathan, that is how the logic basically flows >>> today; however, with cachegroup fallback configuration now it can be >>> deep[if enabled] -> cz -> geo[if fallback config allows]. >>> >>> Marking a cachegroup as "CZ-only" is really about filtering possible >>> cachegroups in selection *after* a client's location is discovered (by >>> geoIP DB). So it can really be described as "given the method of >>> client localization, filter out certain cachegroup targets". >>> >>> "Deep-only": filtered out after the "CZ localization" and "post-Geo >>> localization" steps >>> "CZ-only": filtered out after the "Geo localization" step >>> "Geo-only": filtered out after the "deep/regular-CZ" steps >>> >>> Right now, those all seem somewhat mutually exclusive (except CZ kind >>> of includes both deep and regular CZ), unless you wanted to do >>> something like "Deep and Geo only". I don't know if that's a valid use >>> case, but maybe "CZ and Future-thing only" would make sense. So maybe >>> cachegroups should really be described as: >>> >>> "Deep-enabled": allowed after "deep-CZ localization" step >>> "CZ-enabled": allowed after the "regular-CZ localization" step >>> "Geo-enabled": allowed after the "geo localization" step >>> "Future-thing-enabled": allowed after the "future-thing" step >>> >> >> +1. Well said. >> >> >>> >>> Then we could add multiple permissions to a cachegroup rather than >>> making them mutually exclusive. For the initial use case I proposed >>> this for, I would just be marking the cachegroups that aren't directly >>> connected to the internet as "Deep-enabled, CZ-enabled, >>> future-thing-enabled" rather than "CZ-only". "Deep-only" cachegroups >>> would be marked "deep-enabled". >>> >>> If no permissions are configured, all permissions are given. Enabling >>> one permission means all other permissions are disabled. >>> >>> I think this could be done by adding an array-type column to the >>> cachegroup table/API like so: >>> >>> { >>> "name": "cache_group_edge", >>> "shortName": "cg_edge", >>> "latitude": 12, >>> "longitude": 45, >>> "permissions": [ >>> "DEEP", >>> "CZ", >>> "GEO" >>> ], >>> "typeId": 6 >>> } >>> >> >> The array feels a little fragile, perhaps. Should we decorate each entry >> with an "order", for completeness? (It's obvious to us that the order is >> DEEP->CZ->GEO, but might not be for new users.) >> >> >>> The "permissions" field would remain optional, meaning that no >>> permissions chosen assumes *all* permissions are enabled (giving you >>> the existing default behavior). Postgres has array-type columns which >>> would map to this API quite nicely. In fact, I'm also kind of >>> rethinking the "Cachegroup Fallback" API after going over this, >>> because listing a cachegroup's fallbacks in an array like this could >>> make sense and remove the need for the new cachegroup_fallbacks API... >> >> >> +1 here as well (without knowing the ins-and-outs of the Cachegroup >> Fallback API). >> >> >> >>> On Wed, Jul 4, 2018 at 3:47 PM Gray, Jonathan <jonathan_g...@comcast.com >>> >>> wrote: >>>> >>>> If I'm not mistaken, today the logic is fall through on miss (deep[if >>> enabled] -> cz -> geo). The suggestion to make a 1:* relationship moves >>> that from being implicit in the code to explicit choice by the DS owner. >>> Changing the database/apis is expensive enough that maybe we can't make >>> that jump near term. If you do only add a single field for this using an >>> enum, there should be a default 'fallthrough' or 'native' option to >>> replicate the old behavior. Also, I misspoke earlier, this isn't about >> the >>> routing methods it's about localization methods. >>>> >>>> On 7/4/18, 11:18 AM, "Jeremy Mitchell" <mitchell...@gmail.com> wrote: >>>> >>>> Can a cache group have many "routing methods". If not, would one >>> column >>>> (cachegroup.routing_method) suffice where acceptable values are an >>> enum? ( >>>> CZ, DEEP, GEO) >>>> >>>> On Tue, Jul 3, 2018 at 7:05 PM, Mark Torluemke < >>> mtorlue...@apache.org> >>>> wrote: >>>> >>>>> Feels like columns in the cachegroup table could go a long way in >>> the short >>>>> term -- routing_cz, routing_geo, routing_deep? >>>>> >>>>> On Tue, Jul 3, 2018 at 1:04 PM, Rawlin Peters < >>> rawlin.pet...@gmail.com> >>>>> wrote: >>>>> >>>>>> Thanks for the suggestion, Jonathan. I wasn't even thinking >>> about the >>>>>> possibility of "deep-only" cachegroups, but I could definitely >>> see >>>>>> that as a future use case. >>>>>> >>>>>> Do you envision something like a table of cachegroup >> permissions >>>>>> (cachegroup_id, cachegroup_permission enum type), where the >> enums >>>>>> would be DEEP_ONLY and CZ_ONLY to start with? That would >>> definitely >>>>>> increase initial dev time a bit and might require some new API >>>>>> endpoints to add/remove permissions unless we can make the new >>> API >>>>>> field use an array value. >>>>>> On Tue, Jul 3, 2018 at 12:23 PM Gray, Jonathan >>>>>> <jonathan_g...@comcast.com> wrote: >>>>>>> >>>>>>> Rather than a cz_only flag, it might be more powerful to have >>> a join >>>>>> table with allowed routing methods. You could cover the same >>> use case, >>>>> but >>>>>> it would also allow you to do certain things like deep_only or >>>>> effectively >>>>>> not-geo. >>>>>>> >>>>>>> - Jonathan >>>>>>> >>>>>>> On 7/3/18, 12:03 PM, "Rawlin Peters" < >> rawlin.pet...@gmail.com> >>> wrote: >>>>>>> >>>>>>> Hey Traffic Controllers, >>>>>>> >>>>>>> I'd like to be able to mark a cachegroup as "CZ-only" via >>> the API >>>>> so >>>>>>> that off-net clients (i.e. IPs that aren't included in >> the >>> Coverage >>>>>>> Zone File) don't get routed to "CZ-only" cachegroups. >> This >>> is >>>>> because >>>>>>> some cachegroups aren't directly connected to the >> internet >>> and >>>>>> routing >>>>>>> off-net clients to those cachegroups is expensive. This >>> proposal >>>>>> would >>>>>>> change Traffic Router behavior to route these clients to >>> the >>>>> closest >>>>>>> available cachegroup that's NOT marked as "CZ-only". >>>>>>> >>>>>>> My proposal is to add a boolean column to the cachegroup >>> table - >>>>>>> cz_only - which is then included in the CRConfig's >>> "edgeLocations" >>>>>> for >>>>>>> Traffic Router to parse and look up when routing off-net >>> clients. >>>>> By >>>>>>> default it will be false to keep the existing behavior. >>> The new >>>>> field >>>>>>> will be optional in the API but NOT NULL in the DB, so >>> null values >>>>> in >>>>>>> requests will explicitly be set to false in the DB. >>>>>>> >>>>>>> Questions/concerns? >>>>>>> >>>>>>> - Rawlin >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>>> >>> >>