diff --git a/mcproxy/include/parser/interface.hpp b/mcproxy/include/parser/interface.hpp index fef04d87c448b2b790a1ce1ef21b8287e472e1e4..93d5d239ad0224a38d9dcd11eed39ebf0cda7cae 100644 --- a/mcproxy/include/parser/interface.hpp +++ b/mcproxy/include/parser/interface.hpp @@ -220,6 +220,10 @@ public: const std::string& get_instance_name() const; const std::list<std::shared_ptr<interface>>& get_upstreams() const; const std::list<std::shared_ptr<interface>>& get_downstreams() const; + bool delete_upstream(const std::shared_ptr<interface>& id); + bool delete_downstream(const std::shared_ptr<interface>& id); + int get_upstream_count() const; + int get_downstream_count() const; const std::list<std::shared_ptr<rule_binding>>& get_global_settings() const; int get_table_number() const; bool get_user_selected_table_number() const; diff --git a/mcproxy/src/parser/configuration.cpp b/mcproxy/src/parser/configuration.cpp index 18d804494ced0dee2a39423310856170bcc70f70..0181e7d21ca4329f850663b3d9b9a2fa6f3dd8f0 100644 --- a/mcproxy/src/parser/configuration.cpp +++ b/mcproxy/src/parser/configuration.cpp @@ -212,25 +212,45 @@ void configuration::initalize_interfaces() }; for (auto & inst : def_set) { + auto downstreams = inst->get_downstreams(); + for (auto & downstream : downstreams) { + try { + add(downstream); + } catch (const char *s) { + inst->delete_downstream(downstream); + continue; + } + } - try { - for (auto & downstream : inst->get_downstreams()) { - add(downstream); + if (inst->get_downstream_count() == 0) { + m_inst_def_set.erase(inst); + continue; } - for (auto & upstream : inst->get_upstreams()) { - add(upstream); + auto upstreams = inst->get_upstreams(); + for (auto & upstream : upstreams) { + try { + add(upstream); + } catch (const char *s) { + inst->delete_upstream(upstream); + continue; + } } - if (!m_interfaces_map.insert(std::pair<std::string, std::shared_ptr<interfaces>>(inst->get_instance_name(), result)).second) { - HC_LOG_ERROR("proxy instance " << inst->get_instance_name() << " already exists"); - throw "failed to add instance"; + if (inst->get_upstream_count() == 0) { + m_inst_def_set.erase(inst); + continue; } - } catch (const char *s) { - m_inst_def_set.erase(inst); - continue; - } + try { + if (!m_interfaces_map.insert(std::pair<std::string, std::shared_ptr<interfaces>>(inst->get_instance_name(), result)).second) { + HC_LOG_ERROR("proxy instance " << inst->get_instance_name() << " already exists"); + throw "failed to add instance"; + } + } catch (const char *s) { + m_inst_def_set.erase(inst); + continue; + } } if (m_inst_def_set.size() == 0) { diff --git a/mcproxy/src/parser/interface.cpp b/mcproxy/src/parser/interface.cpp index 3da8e27307e8095aba6777c090c530ad5dd3bfb8..3cf51f0b5827e99e4ebd43e939571eeb752dba0f 100644 --- a/mcproxy/src/parser/interface.cpp +++ b/mcproxy/src/parser/interface.cpp @@ -517,6 +517,46 @@ const std::list<std::shared_ptr<interface>>& instance_definition::get_downstream return m_downstreams; } +int instance_definition::get_upstream_count() const +{ + HC_LOG_TRACE(""); + return m_upstreams.size(); +} + +int instance_definition::get_downstream_count() const +{ + HC_LOG_TRACE(""); + return m_downstreams.size(); +} + +bool instance_definition::delete_upstream(const std::shared_ptr<interface>& id) +{ + std::list<std::shared_ptr<interface>>::iterator i; + + HC_LOG_TRACE(""); + for (i = m_upstreams.begin(); i != m_upstreams.end(); ++i) { + if (id == *i) { + m_upstreams.erase(i); + return true; + } + } + return false; +} + +bool instance_definition::delete_downstream(const std::shared_ptr<interface>& id) +{ + std::list<std::shared_ptr<interface>>::iterator i; + + HC_LOG_TRACE(""); + for (i = m_downstreams.begin(); i != m_downstreams.end(); ++i) { + if (id == *i) { + m_downstreams.erase(i); + return true; + } + } + return false; +} + const std::list<std::shared_ptr<rule_binding>>& instance_definition::get_global_settings() const { HC_LOG_TRACE("");