Exemplo n.º 1
0
void endpoint::AclBind<true>::post(const server::Request& request,
    server::Response& response) {
    const auto acl_port_pair = get_acl_and_port_uuid(request);

    if (NetworkManager::get_instance()->get_acl_port_manager().entry_exists(acl_port_pair.first, acl_port_pair.second)) {
        THROW(agent_framework::exceptions::InvalidParameters, "rest",
              "Port " + std::to_string(NetworkManager::get_instance()->get_port_manager().uuid_to_rest_id(acl_port_pair.second))
              + " is already bound to ACL " + request.params[PathParam::ACL_ID]);
    }

    const requests::AddAclPort add_acl_port_request{
        acl_port_pair.first,
        attribute::Array<std::string>(std::vector<std::string>{acl_port_pair.second}),
        attribute::Oem()
    };

    const auto agent_id = model::Find<agent_framework::model::Switch>
        (request.params[PathParam::ETHERNET_SWITCH_ID]).get().get_agent_id();

    const auto add_acl_port_response = AgentManager::get_instance()
        ->call_method<responses::AddAclPort>(agent_id, add_acl_port_request);

    NetworkManager::get_instance()->get_acl_port_manager().add_entry(acl_port_pair.first, acl_port_pair.second, agent_id);
    response.set_status(server::status_2XX::NO_CONTENT);
}
Exemplo n.º 2
0
void endpoint::AclBind<true>::post(const server::Request& request, server::Response& response) {
    static const constexpr char TRANSACTION_NAME[] = "PostAclBind";

    const auto json = JsonValidator::validate_request_body<schema::AclPostSchema>(request);
    const auto acl_port_pair = get_acl_and_port_uuid(request, json);

    if (NetworkComponents::get_instance()->get_acl_port_manager().entry_exists(acl_port_pair.first,
                                                                               acl_port_pair.second)) {
        THROW(agent_framework::exceptions::InvalidValue, "rest",
              "Port " + std::to_string(
                  NetworkComponents::get_instance()->get_port_manager().uuid_to_rest_id(acl_port_pair.second))
              + " is already bound to ACL " + request.params[PathParam::ACL_ID]);
    }

    const requests::AddAclPort add_acl_port_request{
        acl_port_pair.first,
        attribute::Array<std::string>(std::vector<std::string>{acl_port_pair.second}),
        attribute::Oem()
    };

    const auto parent_switch =
        model::find<agent_framework::model::EthernetSwitch>(request.params).get();
    const auto agent_id = parent_switch.get_agent_id();
    const auto& gami_agent = psme::core::agent::AgentManager::get_instance()->get_agent(agent_id);

    auto add_acl_port = [&, gami_agent] {
        const auto add_acl_port_response = gami_agent->execute<responses::AddAclPort>(add_acl_port_request);

        model::handler::HandlerManager::get_instance()->
            get_handler(enums::Component::Acl)->
            load(gami_agent, parent_switch.get_uuid(),
                 enums::Component::EthernetSwitch, acl_port_pair.first, true);

        NetworkComponents::get_instance()->get_acl_port_manager().add_entry(acl_port_pair.first, acl_port_pair.second,
                                                                            agent_id);
        response.set_status(server::status_2XX::NO_CONTENT);
    };

    gami_agent->execute_in_transaction(TRANSACTION_NAME, add_acl_port);
}