Location and Origin columns were listed out in my more detailed initial proposal [1]. In there I proposed having either a DeliveryService FK in the Origin table or a new deliveryservice_origin table to support many-to-many. But I think keeping the DS FK in the Origin table is the right thing to do, because we could temporarily allow duplicate origins (as we do today), give everyone a few releases to make sure they've fixed all their existing DSes with duplicate origins, then slap a unique constraint on the Origin fqdn. That would prevent the erroneous config that occurs from having duplicate origins like you described.
- Rawlin [1] https://lists.apache.org/thread.html/ed09765621271250893ae3ac1f5b1e984eae0071eab46057b8264c00@%3Cdev.trafficcontrol.apache.org%3E On Thu, Mar 22, 2018 at 1:31 PM, Eric Friedrich (efriedri) <efrie...@cisco.com> wrote: > >> On Mar 22, 2018, at 12:27 PM, Rawlin Peters <rawlin.pet...@gmail.com> wrote: >> >> This Origin Refactor proposal was probably too much to parse at once. >> Here's a slightly shorter version: >> 1. Split Locations out of the Cachegroup table into their own table > EF> Location is latitude/longitude? > > >> 2. Split Origins out of the Server and Delivery Service tables into >> their own table (Origin would have a FK to DeliveryService, supporting >> a one-to-many relationship between DSes and Origins) > EF> What are the properties of an Origin? > > EF> Also, having a separate origin object might let us prevent for the > messiness that comes when adding the same origin as both a Live DS and a VOD > DS on the same cache (today hosting.config stores both DS’ on disk) > >> >> In order to make the transition smoother, I'd like to try to keep the >> existing Delivery Service and Cachegroup API request/response formats >> in place, but their implementations would change to populate the new >> DB tables. For instance, if I create a DS with the Origin >> http://www.example.com, the DS API backend would now parse that URL >> and create a new row in the Origin table with a foreign key to that >> DS. >> >> For the Cachegroup API, if I create a new Cachegroup with the >> coordinates [1, 2], the backend would then create a new row in the >> Location table using those coordinates (probably name it generically >> using the Cachegroup name), and the cachegroup row would contain a >> foreign key to that Location. >> >> Of course there would also be new API endpoints to CRUD Locations and >> Origins by themselves. >> >> Initially, the current MSO implementation would continue to use >> origins created using the Server table, but we would transition the >> MSO implementation over to using the new Origin table eventually. >> >> Questions/thoughts/concerns about any of this? All feedback is welcome. >> >> Thanks, >> Rawlin >> >> On Mon, Mar 12, 2018 at 1:46 PM, Rawlin Peters <rawlin.pet...@gmail.com> >> wrote: >>> Hey folks, >>> >>> As promised, this email thread will be to discuss how to best >>> associate an Origin Latitude/Longitude with a Delivery Service, >>> primarily so that steering targets can be ordered/sent to the client >>> based upon the location of those targets (i.e. the Origin), a.k.a. >>> Steering Target Geo-Ordering. This is potentially going to be a pretty >>> large change, so all your feedback/questions/concerns are appreciated. >>> >>> Here were a handful of bad ideas I had in order to accomplish this DS >>> Origin Lat/Long association (feel free to skip to PROPOSED SOLUTION >>> below): >>> >>> 1. Reuse the current MSO (multisite origin) backend (i.e. add the >>> origin into the servers table, give it a lat/long from its cachegroup, >>> assign the origin server to the DS) >>> Pros: >>> - reuse of existing db schema, probably wouldn't have to add any new >>> tables/columns >>> Cons: >>> - MSO configuration is already very complex >>> - for the simple case of just wanting to give an Origin a lat/long you >>> have to create a server (of which only a few fields make sense for an >>> Origin), add it to a cachegroup (only name and lat/long make sense, >>> won't use parent relationships, isn't really a "group" of origins), >>> assign it to a server profile (have to create one first, no parameters >>> are needed), and finally assign that Origin server to the delivery >>> service (did I miss anything?) >>> >>> 2. Add Origin lat/long columns to the deliveryservice table >>> Pros: >>> - probably the most straightforward solution for Steering Target >>> Geo-Ordering given that Origin FQDN is currently a DS field. >>> Cons: >>> - doesn't work well with MSO >>> - could be confused with Default Miss Lat/Long >>> - if two different delivery services use colocated origins, the same >>> lat/long needs entered twice >>> - adds yet another column to the crowded deliveryservice table >>> >>> 3. Add origin lat/long parameters to a Delivery Service Profile >>> Pros: >>> - Delivery Services using colocated origins could share the same profile >>> - no DB schema updates needed >>> Cons: >>> - profile parameters lack validation >>> - still doesn't support lat/long for multiple origins associated with a DS >>> >>> 4. Add the lat/long to the steering target itself (i.e. where you >>> choose weight/order, you'd also enter lat/long) >>> Pros: >>> - probably the easiest/quickest solution in terms of development >>> Cons: >>> - only applies lat/long to a steering target >>> - using the same target in multiple Steering DSes means having to keep >>> the lat/long synced between them all >>> - lat/long not easily reused by other areas that may need it in the future >>> >>> >>> >>> PROPOSED SOLUTION: >>> >>> All of those ideas were suboptimal, which is why I think we need to: >>> 1. Split Locations out of the cachegroup table into their own table >>> with the following columns (cachegroup would have a foreign key to >>> Location): >>> - name >>> - latitude >>> - longitude >>> >>> 2. Split Origins out of the server and deliveryservice tables into >>> their own table with the following columns: >>> - fqdn >>> - protocol (http or https) >>> - port (optional, can be inferred from protocol) >>> - location (optional FK to Location table) >>> - deliveryservice FK (if an Origin can only be associated with a >>> single DS. Might need step 3 below for many-to-many) >>> - ip_address (optional, necessary to support `use_ip_address` profile >>> parameter for using the origin's IP address rather than fqdn in >>> parent.config) >>> - ip6_address (optional, necessary because we'd have an ip_address >>> column for the same reasons) >>> - profile (optional, primarily for MSO-specific parameters - rank and >>> weight - but I could be convinced that this is unnecessary) >>> - cachegroup (optional, necessary to maintain primary/secondary >>> relationship between MID_LOC and ORG_LOC cachegroups for MSO) >>> >>> 3. If many-to-many DSes to Origins will still be possible, create a >>> new deliveryservice_origin table to support a many-to-many >>> relationship between DSes and origins >>> - the rank/weight fields for MSO could be added here possibly, maybe >>> other things as well? >>> >>> 4. Consider constraints in the origin and deliveryservice_origin table >>> - must fqdn alone be unique? fqdn, protocol, and port combined? >>> >>> The process for creating a Delivery Service would change in that >>> Origins would have to be created separately and added to the delivery >>> service. However, to aid migration to the new way of doing things, our >>> UIs could keep the "Origin FQDN" field but the API backend would then >>> create a new row in the Origin table and add it to the DS. More >>> Origins could then be added (for MSO purposes) to the DS via a new API >>> endpoint. MSO configuration would change at least in how Origins are >>> assigned to a DS ("server assignments" would then just be for >>> EDGE-type servers). >>> >>> Cachegroup creation also changes in that Locations need to be created >>> before associating them to a Cachegroup. However, our UIs could also >>> stay the same with the backend API updated to create a Location from >>> the Cachegroup request and tie it to the Cachegroup. >>> >>> >>> >>> I know there are a lot of backend and frontend implications with these >>> changes that would still need to be worked out, but in general does >>> this proposal sound good? Questions/concerns/feedback welcome and >>> appreciated! >>> >>> - Rawlin >