RouteHandleMap::RouteHandleMap( const RouteSelectorMap& routeSelectors, const RoutingPrefix& defaultRoute, bool sendInvalidRouteToDefault) : defaultRoute_(defaultRoute), sendInvalidRouteToDefault_(sendInvalidRouteToDefault) { checkLogic(routeSelectors.find(defaultRoute_) != routeSelectors.end(), "invalid default route: {}", defaultRoute_.str()); RouteSelectorVector allRoutes; std::unordered_map<std::string, RouteSelectorVector> byRegion; std::unordered_map<std::string, RouteSelectorVector> byRoute; // add defaults first for (const auto& it : routeSelectors) { RoutingPrefix prefix(it.first); if (prefix.str() == defaultRoute_.str()) { allRoutes.push_back(it.second); } if (prefix.getRegion() == defaultRoute_.getRegion()) { byRegion[prefix.getRegion().str()].push_back(it.second); } } // then add rest for (const auto& it : routeSelectors) { RoutingPrefix prefix(it.first); if (prefix.str() != defaultRoute_.str()) { allRoutes.push_back(it.second); } if (prefix.getRegion() != defaultRoute_.getRegion()) { byRegion[prefix.getRegion().str()].push_back(it.second); } byRoute[it.first].push_back(it.second); } // create corresponding RoutePolicyMaps UniqueVectorMap uniqueVectors; allRoutes_ = makePolicyMap(uniqueVectors, allRoutes); for (const auto& it : byRegion) { byRegion_.emplace(it.first, makePolicyMap(uniqueVectors, it.second)); } for (const auto& it : byRoute) { byRoute_.emplace(it.first, makePolicyMap(uniqueVectors, it.second)); } assert(byRoute_.find(defaultRoute_) != byRoute_.end()); defaultRouteMap_ = byRoute_[defaultRoute_]; }
PolicyBucket::PolicyBucket(const PolicyBucketId &id, const PolicyResult &defaultPolicy, const PolicyCollection &policies) : m_policyCollection(makePolicyMap(policies)), m_defaultPolicy(defaultPolicy), m_id(id) { idValidator(id); }
PolicyBucket::PolicyBucket(const PolicyBucketId &id, const PolicyCollection &policies) : m_policyCollection(makePolicyMap(policies)), m_defaultPolicy(PredefinedPolicyType::DENY), m_id(id) { idValidator(id); }