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