]> git.proxmox.com Git - pve-common.git/blame - README.dev
add reference to fence-agents-pve.git
[pve-common.git] / README.dev
CommitLineData
e143e9d8
DM
1====================================
2Setup PVE v2 Development Environment
3====================================
4
51. Install Debian 'squeeze'
62. Install prerequisites for development environment:
7
7da024b1 8apt-get -y install build-essential git-core debhelper autotools-dev \
e143e9d8
DM
9doxygen check pkg-config libnss3-dev groff quilt dpatch libxml2-dev \
10libncurses5-dev libslang2-dev libldap2-dev xsltproc python-pexpect \
11python-pycurl libdbus-1-dev openipmi sg3-utils libnet-snmp-perl \
12libnet-telnet-perl snmp python-openssl libxml2-utils automake autoconf \
13libsqlite3-dev sqlite3 libfuse-dev libglib2.0-dev librrd-dev \
14librrds-perl rrdcached lintian libdevel-cycle-perl libjson-perl \
15liblinux-inotify2-perl libio-stringy-perl unzip fuse-utils \
16libcrypt-openssl-random-perl libcrypt-openssl-rsa-perl \
17libauthen-pam-perl libterm-readline-gnu-perl libssl-dev open-iscsi \
18libapache2-mod-perl2 libfilesys-df-perl libfile-readbackwards-perl \
19libpci-dev texi2html libgnutls-dev libsdl1.2-dev bridge-utils \
20libvncserver0 rpm2cpio apache2-mpm-prefork libintl-perl \
21libapache2-request-perl libnet-dns-perl vlan libio-socket-ssl-perl \
22libfile-sync-perl ifenslave-2.6 libnet-ldap-perl console-data
23
7da024b1 243. Download and install the following git modules in order from top to bottom:
e143e9d8 25
7da024b1 26# git clone git://git.proxmox.com/git/<PACKAGE.git>
e143e9d8 27
7da024b1
DM
28You currently need the following packages:
29
30libqb.git
31corosync-pve.git
32openais-pve.git
33pve-common.git
34pve-cluster.git
35redhat-cluster-pve.git
36pve-access-control.git
37pve-storage.git
38pve-qemu-kvm.git
39qemu-server.git
40vncterm.git
41pve-manager.git
42pve-kernel-2.6.32.git
d232e4b6 43fence-agents-pve.git
e143e9d8
DM
44
45Most source can be installed with 'make dinstall' command.
46
474. Reboot the system.
485. Learn to use the quilt patch scripts.
496. Happy coding.
50
51There is an experimental package containing the API documentation
52as ExtJS application:
53
7da024b1
DM
54pve2-api-doc.git
55
56You can view the source code at:
57
58https://git.proxmox.com
e143e9d8
DM
59
60
61REST vs. SOAP
62=============
63
64We decided to change our SOAP API (1.X) and use a REST like API. The
65concept is described in [1] (Resource Oriented Architecture
66(ROA)). The main advantage is that we are able to remove a lot of code
67(the whole SOAP stack) to reduce software complexity.
68
69We also moved away from server side content generation. Instead we use
70the ExtJS Rich Internet Application Framework
71(http://www.sencha.com).
72
73That framework, like any other AJAX toolkit, can talk directly to the
74REST API using JSON. So we were able to remove the server side
75template toolkit completely.
76
77JSON and JSON Schema
78====================
79
80We use JSON as data format, because it is simple and parse-able by any
81web browser.
82
83Additionally, we use JSON Schema [2] to formally describe our API. So
84we can automatically generate the whole API Documentation, and we can
85verify all parameters and return values.
86
87An great side effect was that we are able to use JSON Schema to
88produce command line argument parsers automatically. In fact, the REST
89API and the command line tools use the same code.
90
91Object linkage is done using the JSON Hyper Schema (links property).
92
93A small utility called 'pvesh' exposes the whole REST API on the command
94line.
95
96So here is a summary of the advantage:
97
98 - easy, human readable data format (native web browser format)
99 - automatic parameter verification (we can also verify return values)
100 - automatic generation of API documentation
101 - easy way to create command line tools (using same API).
102
103API Implementation (PVE::RESTHandler)
104=====================================
105
106All classes exposing methods on the API use PVE::RESTHandler as base class.
107
108 use base qw(PVE::RESTHandler);
109
110To expose methods, one needs to call register_method():
111
112 __PACKAGE__->register_method ($schema);
113
114Where $schema is a PVE method schema as described in
115PVE::JSONSchema. It includes a description of parameters and return
116values, and a reference to the actual code
117
118__PACKAGE__->register_method ({
119 name => 'echo',
120 path => 'echo',
121 method => 'GET',
122 description => "simple return value of parameter 'text'",
123 parameters => {
124 additionalProperties => 0,
125 properties => {
126 text => {
127 type => 'string',
128 }
129 },
130 },
131 returns => {
132 type => 'string',
133 },
134 code => sub {
135 my ($conn, $resp, $param) = @_;
136
137 return $param->{text};
138 }
139});
140
141The 'name' property is only used if you want to call the method
142directly from Perl. You can do that using:
143
144 print __PACKAGE__->echo({ text => "a test" });
145
146We use Perl's AUTOLOAD feature to implement this. Note: You need to
147pass parameters a HASH reference.
148
149There is a special helper method called cli_handler(). This is used by
150the CLIHandler Class for command line tools, where you want to pass
151arguments as array of strings. This uses Getopt::Long to parse parameters.
152
153There is a second way to map names to methods - using the 'path'
154property. And you can register subclasses. That way you can set up a
155filesystem like hierarchy to access methods.
156
157Here is an example:
158----------------------------
159package C1;
160
161__PACKAGE__->register_method ({
162 subclass => "C2",
163 path => 'sub2',
164});
165
166
167__PACKAGE__->register_method ({
168 name => 'list1',
169 path => 'index',
170 method => 'GET',
171 ...
172});
173
174package C2;
175
176__PACKAGE__->register_method ({
177 name => 'list2',
178 path => 'index',
179 method => 'GET',
180 ...
181});
182-------------------------------
183
184The utily method find_handler (in PVE::RESTHandler) can be use to do
185'path' related method lookups.
186
187C1->find_handler('GET', "/index") => C1::list1
188C1->find_handler('GET', "/sub2/index") => C2::list2
189
190The HTTP server use the URL (a path) to find the corresponding method.
191
192
193References
194==========
195[1] RESTful Web Services
196Web services for the real world
197
198By
199 Leonard Richardson, Sam Ruby
200Publisher:
201 O'Reilly Media
202Released:
203 May 2007
204
205[2] JSON Schema links: http://json-schema.org/