Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/extensions/bootstrap/wasm/config.cc
Line
Count
Source (jump to first uncovered line)
1
#include "source/extensions/bootstrap/wasm/config.h"
2
3
#include "envoy/registry/registry.h"
4
#include "envoy/server/factory_context.h"
5
6
#include "source/common/common/empty_string.h"
7
#include "source/common/config/datasource.h"
8
#include "source/common/protobuf/utility.h"
9
#include "source/extensions/common/wasm/wasm.h"
10
11
namespace Envoy {
12
namespace Extensions {
13
namespace Bootstrap {
14
namespace Wasm {
15
16
0
void WasmServiceExtension::onServerInitialized() { createWasm(context_); }
17
18
0
void WasmServiceExtension::createWasm(Server::Configuration::ServerFactoryContext& context) {
19
0
  auto plugin = std::make_shared<Common::Wasm::Plugin>(
20
0
      config_.config(), envoy::config::core::v3::TrafficDirection::UNSPECIFIED, context.localInfo(),
21
0
      nullptr);
22
23
0
  auto callback = [this, &context, plugin](Common::Wasm::WasmHandleSharedPtr base_wasm) {
24
0
    if (!base_wasm) {
25
0
      if (plugin->fail_open_) {
26
0
        ENVOY_LOG(error, "Unable to create Wasm service {}", plugin->name_);
27
0
      } else {
28
0
        ENVOY_LOG(critical, "Unable to create Wasm service {}", plugin->name_);
29
0
      }
30
0
      return;
31
0
    }
32
0
    if (config_.singleton()) {
33
      // Return a Wasm VM which will be stored as a singleton by the Server.
34
0
      wasm_service_ = std::make_unique<WasmService>(
35
0
          plugin, Common::Wasm::getOrCreateThreadLocalPlugin(base_wasm, plugin,
36
0
                                                             context.mainThreadDispatcher()));
37
0
      return;
38
0
    }
39
    // Per-thread WASM VM.
40
    // NB: the Slot set() call doesn't complete inline, so all arguments must outlive this call.
41
0
    auto tls_slot =
42
0
        ThreadLocal::TypedSlot<Common::Wasm::PluginHandleSharedPtrThreadLocal>::makeUnique(
43
0
            context.threadLocal());
44
0
    tls_slot->set([base_wasm, plugin](Event::Dispatcher& dispatcher) {
45
0
      return std::make_shared<Common::Wasm::PluginHandleSharedPtrThreadLocal>(
46
0
          Common::Wasm::getOrCreateThreadLocalPlugin(base_wasm, plugin, dispatcher));
47
0
    });
48
0
    wasm_service_ = std::make_unique<WasmService>(plugin, std::move(tls_slot));
49
0
  };
50
51
0
  if (!Common::Wasm::createWasm(plugin, context.scope().createScope(""), context.clusterManager(),
52
0
                                context.initManager(), context.mainThreadDispatcher(),
53
0
                                context.api(), context.lifecycleNotifier(), remote_data_provider_,
54
0
                                std::move(callback))) {
55
    // NB: throw if we get a synchronous configuration failures as this is how such failures are
56
    // reported to xDS.
57
0
    throw Common::Wasm::WasmException(
58
0
        fmt::format("Unable to create Wasm service {}", plugin->name_));
59
0
  }
60
0
}
61
62
Server::BootstrapExtensionPtr
63
WasmFactory::createBootstrapExtension(const Protobuf::Message& config,
64
0
                                      Server::Configuration::ServerFactoryContext& context) {
65
0
  auto typed_config =
66
0
      MessageUtil::downcastAndValidate<const envoy::extensions::wasm::v3::WasmService&>(
67
0
          config, context.messageValidationContext().staticValidationVisitor());
68
0
  context.api().customStatNamespaces().registerStatNamespace(
69
0
      Extensions::Common::Wasm::CustomStatNamespace);
70
0
  return std::make_unique<WasmServiceExtension>(typed_config, context);
71
0
}
72
73
// /**
74
//  * Static registration for the wasm factory. @see RegistryFactory.
75
//  */
76
REGISTER_FACTORY(WasmFactory, Server::Configuration::BootstrapExtensionFactory);
77
78
} // namespace Wasm
79
} // namespace Bootstrap
80
} // namespace Extensions
81
} // namespace Envoy