All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
nfd-control-command.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
7 #ifndef NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
8 #define NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
9 
11 #include "../util/command-interest-generator.hpp"
12 
13 namespace ndn {
14 namespace nfd {
15 
19 class ControlCommand : noncopyable
20 {
21 public:
24  class ArgumentError : public std::invalid_argument
25  {
26  public:
27  explicit
28  ArgumentError(const std::string& what)
29  : std::invalid_argument(what)
30  {
31  }
32  };
33 
36  const Name&
37  getPrefix() const
38  {
39  return m_prefix;
40  }
41 
44  Interest
46  CommandInterestGenerator& commandInterestGenerator) const
47  {
48  this->validateRequest(parameters);
49 
50  Name name = m_prefix;
51  name.append(parameters.wireEncode());
52  Interest commandInterest(name);
53  commandInterestGenerator.generate(commandInterest);
54  return commandInterest;
55  }
56 
60  virtual void
61  validateRequest(const ControlParameters& parameters) const
62  {
63  m_requestValidator.validate(parameters);
64  }
65 
68  virtual void
70  {
71  }
72 
76  virtual void
77  validateResponse(const ControlParameters& parameters) const
78  {
79  m_responseValidator.validate(parameters);
80  }
81 
84  virtual void
86  {
87  }
88 
89 protected:
90  ControlCommand(const std::string& module, const std::string& verb)
91  : m_prefix("ndn:/localhost/nfd")
92  {
93  m_prefix.append(module).append(verb);
94  }
95 
97  {
98  public:
100  : m_required(CONTROL_PARAMETER_UBOUND)
101  , m_optional(CONTROL_PARAMETER_UBOUND)
102  {
103  }
104 
109  {
110  m_required[field] = true;
111  return *this;
112  }
113 
118  {
119  m_optional[field] = true;
120  return *this;
121  }
122 
127  void
128  validate(const ControlParameters& parameters) const
129  {
130  const std::vector<bool>& presentFields = parameters.getPresentFields();
131 
132  for (size_t i = 0; i < CONTROL_PARAMETER_UBOUND; ++i) {
133  bool isPresent = presentFields[i];
134  if (m_required[i]) {
135  if (!isPresent) {
136  throw ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is required but missing");
137  }
138  }
139  else if (isPresent && !m_optional[i]) {
140  throw ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is forbidden but present");
141  }
142  }
143  }
144 
145  private:
146  std::vector<bool> m_required;
147  std::vector<bool> m_optional;
148  };
149 
150 protected:
161 
162 private:
163  Name m_prefix;
164 };
165 
166 
171 {
172 public:
174  : ControlCommand("faces", "create")
175  {
181  }
182 
183  virtual void
184  validateResponse(const ControlParameters& parameters) const
185  {
186  this->ControlCommand::validateResponse(parameters);
187 
188  if (parameters.getFaceId() == 0) {
189  throw ArgumentError("FaceId must not be zero");
190  }
191  }
192 };
193 
194 
199 {
200 public:
202  : ControlCommand("faces", "destroy")
203  {
207  }
208 
209  virtual void
210  validateRequest(const ControlParameters& parameters) const
211  {
212  this->ControlCommand::validateRequest(parameters);
213 
214  if (parameters.getFaceId() == 0) {
215  throw ArgumentError("FaceId must not be zero");
216  }
217  }
218 
219  virtual void
220  validateResponse(const ControlParameters& parameters) const
221  {
222  this->validateRequest(parameters);
223  }
224 };
225 
226 
228 {
229 public:
230  virtual void
231  validateRequest(const ControlParameters& parameters) const
232  {
233  this->ControlCommand::validateRequest(parameters);
234 
235  switch (parameters.getLocalControlFeature()) {
238  break;
239  default:
240  throw ArgumentError("LocalControlFeature is invalid");
241  }
242  }
243 
244  virtual void
245  validateResponse(const ControlParameters& parameters) const
246  {
247  this->validateRequest(parameters);
248  }
249 
250 protected:
251  explicit
252  FaceLocalControlCommand(const std::string& verb)
253  : ControlCommand("faces", verb)
254  {
258  }
259 };
260 
261 
266 {
267 public:
269  : FaceLocalControlCommand("enable-local-control")
270  {
271  }
272 };
273 
274 
279 {
280 public:
282  : FaceLocalControlCommand("disable-local-control")
283  {
284  }
285 };
286 
287 
292 {
293 public:
295  : ControlCommand("fib", "add-nexthop")
296  {
305  }
306 
307  virtual void
309  {
310  if (!parameters.hasCost()) {
311  parameters.setCost(0);
312  }
313  }
314 
315  virtual void
316  validateResponse(const ControlParameters& parameters) const
317  {
318  this->ControlCommand::validateResponse(parameters);
319 
320  if (parameters.getFaceId() == 0) {
321  throw ArgumentError("FaceId must not be zero");
322  }
323  }
324 };
325 
326 
331 {
332 public:
334  : ControlCommand("fib", "remove-nexthop")
335  {
342  }
343 
344  virtual void
345  validateResponse(const ControlParameters& parameters) const
346  {
347  this->ControlCommand::validateResponse(parameters);
348 
349  if (parameters.getFaceId() == 0) {
350  throw ArgumentError("FaceId must not be zero");
351  }
352  }
353 };
354 
355 
360 {
361 public:
363  : ControlCommand("strategy-choice", "set")
364  {
369  }
370 };
371 
372 
377 {
378 public:
380  : ControlCommand("strategy-choice", "unset")
381  {
385  }
386 
387  virtual void
388  validateRequest(const ControlParameters& parameters) const
389  {
390  this->ControlCommand::validateRequest(parameters);
391 
392  if (parameters.getName().size() == 0) {
393  throw ArgumentError("Name must not be ndn:/");
394  }
395  }
396 
397  virtual void
398  validateResponse(const ControlParameters& parameters) const
399  {
400  this->validateRequest(parameters);
401  }
402 };
403 
404 
405 enum {
406  // route origin
410 
411  // route inheritance flags
414 };
415 
416 
421 {
422 public:
424  : ControlCommand("rib", "register")
425  {
440  }
441 
442  virtual void
444  {
445  if (!parameters.hasFaceId()) {
446  parameters.setFaceId(0);
447  }
448  if (!parameters.hasOrigin()) {
449  parameters.setOrigin(ROUTE_ORIGIN_APP);
450  }
451  if (!parameters.hasCost()) {
452  parameters.setCost(0);
453  }
454  if (!parameters.hasFlags()) {
456  }
457  if (!parameters.hasExpirationPeriod()) {
458  if (parameters.getFaceId() == 0) {
459  parameters.setExpirationPeriod(time::milliseconds::max());
460  }
461  else {
462  parameters.setExpirationPeriod(time::hours(1));
463  }
464  }
465  }
466 
467  virtual void
468  validateResponse(const ControlParameters& parameters) const
469  {
470  this->ControlCommand::validateResponse(parameters);
471 
472  if (parameters.getFaceId() == 0) {
473  throw ArgumentError("FaceId must not be zero");
474  }
475  }
476 };
477 
478 
483 {
484 public:
486  : ControlCommand("rib", "unregister")
487  {
496  }
497 
498  virtual void
500  {
501  if (!parameters.hasFaceId()) {
502  parameters.setFaceId(0);
503  }
504  if (!parameters.hasOrigin()) {
505  parameters.setOrigin(ROUTE_ORIGIN_APP);
506  }
507  }
508 
509  virtual void
510  validateResponse(const ControlParameters& parameters) const
511  {
512  this->ControlCommand::validateResponse(parameters);
513 
514  if (parameters.getFaceId() == 0) {
515  throw ArgumentError("FaceId must not be zero");
516  }
517  }
518 };
519 
520 
521 } // namespace nfd
522 } // namespace ndn
523 
524 #endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
represents a faces/disable-local-control command
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
ControlParameters & setFaceId(uint64_t faceId)
represents a strategy-choice/set command
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
void validate(const ControlParameters &parameters) const
verify that all required fields are present, and all present fields are either required or optional ...
virtual void applyDefaultsToRequest(ControlParameters &parameters) const
apply default values to missing fields in request
represents a fib/add-nexthop command
void generate(Interest &interest, const Name &certificateName=Name())
represents parameters in a ControlCommand request or response
Helper class to generate CommandInterests.
virtual void applyDefaultsToRequest(ControlParameters &parameters) const
apply default values to missing fields in request
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
FieldValidator m_requestValidator
FieldValidator for request ControlParameters.
base class of NFD ControlCommand
ControlParameters & setFlags(uint64_t flags)
const Name & getPrefix() const
FieldValidator m_responseValidator
FieldValidator for response ControlParameters.
An Interest holds a Name and other fields for an interest.
Definition: interest.hpp:24
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
represents a strategy-choice/set command
represents a fib/remove-nexthop command
Interest makeCommandInterest(const ControlParameters &parameters, CommandInterestGenerator &commandInterestGenerator) const
make a Command Interest from parameters
ControlCommand(const std::string &module, const std::string &verb)
represents a faces/create command
virtual void validateRequest(const ControlParameters &parameters) const
validate request parameters
ControlParameters & setExpirationPeriod(const time::milliseconds &expirationPeriod)
const std::vector< bool > & getPresentFields() const
represents a faces/enable-local-control command
virtual void applyDefaultsToResponse(ControlParameters &parameters) const
apply default values to missing fields in response
FaceLocalControlCommand(const std::string &verb)
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
virtual void applyDefaultsToRequest(ControlParameters &parameters) const
apply default values to missing fields in request
FieldValidator & required(ControlParameterField field)
declare a required field
size_t size() const
Get the number of components.
Definition: name.hpp:329
A Name holds an array of Name::Component and represents an NDN name.
Definition: name.hpp:26
size_t wireEncode(EncodingImpl< T > &encoder) const
const std::string CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND]
represents a rib/unregister command
represents a rib/register command
LocalControlFeature getLocalControlFeature() const
virtual void validateRequest(const ControlParameters &parameters) const
validate request parameters
virtual void validateRequest(const ControlParameters &parameters) const
validate request parameters
ControlParameters & setCost(uint64_t cost)
virtual void applyDefaultsToRequest(ControlParameters &parameters) const
apply default values to missing fields in request
Name & append(const uint8_t *value, size_t valueLength)
Append a new component, copying from value of length valueLength.
Definition: name.hpp:142
ControlParameters & setOrigin(uint64_t origin)
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
represents a faces/destroy command
represents an error in ControlParameters
virtual void validateResponse(const ControlParameters &parameters) const
validate response parameters
virtual void validateRequest(const ControlParameters &parameters) const
validate request parameters
FieldValidator & optional(ControlParameterField field)
declare an optional field