blob: 2934e4e66b122cbc1c403829361a1228e4887523 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi5ec80222014-03-25 20:08:05 -07002/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Junxiao Shi5ec80222014-03-25 20:08:05 -070020 */
21
22#ifndef NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
23#define NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
24
25#include "nfd-control-parameters.hpp"
Junxiao Shi5ec80222014-03-25 20:08:05 -070026
27namespace ndn {
28namespace nfd {
29
Alexander Afanasyev4671bf72014-05-19 09:01:37 -040030/**
31 * \ingroup management
32 * \brief base class of NFD ControlCommand
33 * \sa http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
Junxiao Shi5ec80222014-03-25 20:08:05 -070034 */
Junxiao Shi7b6b79d2014-03-26 20:59:35 -070035class ControlCommand : noncopyable
Junxiao Shi5ec80222014-03-25 20:08:05 -070036{
37public:
38 /** \brief represents an error in ControlParameters
39 */
40 class ArgumentError : public std::invalid_argument
41 {
42 public:
43 explicit
44 ArgumentError(const std::string& what)
45 : std::invalid_argument(what)
46 {
47 }
48 };
49
Junxiao Shi5ec80222014-03-25 20:08:05 -070050 /** \brief validate request parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070051 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070052 */
53 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070054 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070055
56 /** \brief apply default values to missing fields in request
57 */
58 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070059 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070060
61 /** \brief validate response parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070062 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070063 */
64 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070065 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070066
67 /** \brief apply default values to missing fields in response
68 */
69 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070070 applyDefaultsToResponse(ControlParameters& parameters) const;
71
72 /** \brief construct the Name for a request Interest
Junxiao Shi5de006b2014-10-26 20:20:52 -070073 * \throw ArgumentError if parameters are invalid
74 */
75 Name
76 getRequestName(const Name& commandPrefix, const ControlParameters& parameters) const;
77
Junxiao Shi5ec80222014-03-25 20:08:05 -070078protected:
Junxiao Shi70911652014-08-12 10:14:24 -070079 ControlCommand(const std::string& module, const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -070080
81 class FieldValidator
82 {
83 public:
Junxiao Shi70911652014-08-12 10:14:24 -070084 FieldValidator();
Junxiao Shi5ec80222014-03-25 20:08:05 -070085
86 /** \brief declare a required field
87 */
88 FieldValidator&
89 required(ControlParameterField field)
90 {
91 m_required[field] = true;
92 return *this;
93 }
94
95 /** \brief declare an optional field
96 */
97 FieldValidator&
98 optional(ControlParameterField field)
99 {
100 m_optional[field] = true;
101 return *this;
102 }
103
104 /** \brief verify that all required fields are present,
105 * and all present fields are either required or optional
106 * \throw ArgumentError
107 */
108 void
Junxiao Shi70911652014-08-12 10:14:24 -0700109 validate(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700110
111 private:
112 std::vector<bool> m_required;
113 std::vector<bool> m_optional;
114 };
115
116protected:
117 /** \brief FieldValidator for request ControlParameters
118 *
119 * Constructor of subclass should populate this validator.
120 */
121 FieldValidator m_requestValidator;
122 /** \brief FieldValidator for response ControlParameters
123 *
124 * Constructor of subclass should populate this validator.
125 */
126 FieldValidator m_responseValidator;
127
128private:
Junxiao Shi5de006b2014-10-26 20:20:52 -0700129 name::Component m_module;
130 name::Component m_verb;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700131};
132
133
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400134/**
135 * \ingroup management
136 * \brief represents a faces/create command
137 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700138 */
139class FaceCreateCommand : public ControlCommand
140{
141public:
Junxiao Shi70911652014-08-12 10:14:24 -0700142 FaceCreateCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700143
144 virtual void
Yukai Tud93c5fc2015-08-25 11:37:16 +0800145 applyDefaultsToRequest(ControlParameters& parameters) const;
146
147 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700148 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700149};
150
151
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400152/**
153 * \ingroup management
154 * \brief represents a faces/destroy command
155 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700156 */
157class FaceDestroyCommand : public ControlCommand
158{
159public:
Junxiao Shi70911652014-08-12 10:14:24 -0700160 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700161
162 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700163 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700164
165 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700166 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700167};
168
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400169/**
170 * \ingroup management
171 * \brief Base class for faces/[*]-local-control commands
172 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700173class FaceLocalControlCommand : public ControlCommand
174{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700175public:
176 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700177 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700178
179 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700180 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700181
Junxiao Shi5ec80222014-03-25 20:08:05 -0700182protected:
183 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700184 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700185};
186
187
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400188/**
189 * \ingroup management
190 * \brief represents a faces/enable-local-control command
191 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700192 */
193class FaceEnableLocalControlCommand : public FaceLocalControlCommand
194{
195public:
Junxiao Shi70911652014-08-12 10:14:24 -0700196 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700197};
198
199
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400200/**
201 * \ingroup management
202 * \brief represents a faces/disable-local-control command
203 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700204 */
205class FaceDisableLocalControlCommand : public FaceLocalControlCommand
206{
207public:
Junxiao Shi70911652014-08-12 10:14:24 -0700208 FaceDisableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700209};
210
211
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400212/**
213 * \ingroup management
214 * \brief represents a fib/add-nexthop command
215 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700216 */
217class FibAddNextHopCommand : public ControlCommand
218{
219public:
Junxiao Shi70911652014-08-12 10:14:24 -0700220 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700221
222 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700223 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700224
225 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700226 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700227};
228
229
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400230/**
231 * \ingroup management
232 * \brief represents a fib/remove-nexthop command
233 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700234 */
235class FibRemoveNextHopCommand : public ControlCommand
236{
237public:
Junxiao Shi70911652014-08-12 10:14:24 -0700238 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700239
240 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700241 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700242
243 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700244 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700245};
246
247
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400248/**
249 * \ingroup management
250 * \brief represents a strategy-choice/set command
251 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700252 */
253class StrategyChoiceSetCommand : public ControlCommand
254{
255public:
Junxiao Shi70911652014-08-12 10:14:24 -0700256 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700257};
258
259
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400260/**
261 * \ingroup management
262 * \brief represents a strategy-choice/set command
263 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700264 */
265class StrategyChoiceUnsetCommand : public ControlCommand
266{
267public:
Junxiao Shi70911652014-08-12 10:14:24 -0700268 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700269
270 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700271 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700272
273 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700274 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700275};
276
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700277
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400278/**
279 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400280 * \brief represents a rib/register command
281 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700282 */
283class RibRegisterCommand : public ControlCommand
284{
285public:
Junxiao Shi70911652014-08-12 10:14:24 -0700286 RibRegisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700287
288 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700289 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700290
291 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700292 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700293};
294
295
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400296/**
297 * \ingroup management
298 * \brief represents a rib/unregister command
299 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700300 */
301class RibUnregisterCommand : public ControlCommand
302{
303public:
Junxiao Shi70911652014-08-12 10:14:24 -0700304 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700305
306 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700307 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700308
309 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700310 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700311};
312
Junxiao Shi5ec80222014-03-25 20:08:05 -0700313} // namespace nfd
314} // namespace ndn
315
316#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP