Difference between revisions of "Developer Documentation"

From Proxmox VE
Jump to navigation Jump to search
m (Mention Acked-by for reviewing patches)
 
(29 intermediate revisions by 7 users not shown)
Line 3: Line 3:
 
Please coordinate your efforts with us before starting any development. It is important to have a common view of the problem and the corresponding solution – just to avoid duplicated or unnecessary efforts.
 
Please coordinate your efforts with us before starting any development. It is important to have a common view of the problem and the corresponding solution – just to avoid duplicated or unnecessary efforts.
  
We will only include software which matches our quality criteria. The source code repository is read only. To include some code, send it as patch (git diff) to the pve-devel mailing list. We will review your code and commit after a successful review (and possible corrections/addition).
+
We will only include software which matches our quality criteria. The source code repository is read only. To include some code, send it as patch (git diff) to the pve-devel mailing list. We will review your code and commit after a successful review (and possible corrections/additions).
  
 
== Mailing List ==
 
== Mailing List ==
This is the primary communication channel for developers, discussing new features and implementation details. If you are a developer and you  want to development additional features, this is the place to start.
+
This is the primary communication channel for developers, discussing new features and implementation details. If you are a developer and you  want to develop additional features, this is the place to start.
  
PVE Development List: https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
+
PVE Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
  
Archive: https://pve.proxmox.com/cgi-bin/mailman/private/pve-devel/
+
Archive: https://lists.proxmox.com/pipermail/pve-devel/
  
 
== Access to Code Repository (git) ==
 
== Access to Code Repository (git) ==
Line 17: Line 17:
 
== Build instructions ==
 
== Build instructions ==
  
You could find build instruction here :
+
You could find build instructions here :
  
 
https://git.proxmox.com/?p=pve-common.git;a=blob_plain;f=README.dev;hb=HEAD
 
https://git.proxmox.com/?p=pve-common.git;a=blob_plain;f=README.dev;hb=HEAD
 +
 +
== Development Package Repository ==
 +
 +
Some packages required for development can only be found in the ''devel'' repository.
 +
This is a cross project repository and may be used for all Proxmox Projects.
 +
 +
Add the following to the <code>/etc/apt/sources.list</code> file:
 +
 +
=== For Proxmox VE 7.x based on Debian 11 Bullseye ===
 +
 +
  deb http://download.proxmox.com/debian/devel/ bullseye main
 +
 +
=== For Proxmox VE 6.x based on Debian 10 Buster ===
 +
 +
  deb http://download.proxmox.com/debian/devel/ buster main
  
 
== Checking out a git repository ==
 
== Checking out a git repository ==
Line 35: Line 50:
 
=== Coding guidelines ===
 
=== Coding guidelines ===
 
The codebase mostly contains perl code, with javascript for the user interface, and C for the Proxmox Cluster Filesystem.
 
The codebase mostly contains perl code, with javascript for the user interface, and C for the Proxmox Cluster Filesystem.
For Perl we recommend to have a look at our [[Perl Style Guide|perl style guide]].
+
For Perl we recommend to have a look at our [[Perl Style Guide|'''perl style guide''']].
For Javascript we use jslint to check code standards, so before submitting a patch you should call
+
 
 +
For JavaScript we use eslint to check code standards, note that not all repositories got switched over to eslint yet, pve-manager still emits errors and warnings.
 +
Check out [[Javascript Style Guide]]
 +
 
 +
We use the ExtJS framework for the Gui Components, its API documentation can be found [http://docs.sencha.com/extjs/6.0.1/index.html here.]
 +
 
 +
=== Using git ===
 +
 
 +
If you are not familiar with git it could be worth to take a look at this interactive tutorial:
 +
https://try.github.io and read a brief introduction chapter from the official git documentation: https://git-scm.com/docs/gittutorial
 +
to gain basic knowledge on it.
 +
 
 +
First, configure your ''real'' name and email address for git, if not done already:
  
 
<source lang="bash">
 
<source lang="bash">
make lint
+
$ git config --global user.name "John Doe"
 +
$ git config --global user.email john@example.com
 
</source>
 
</source>
  
in the <tt>www/manager6</tt> directory of your copy of the pve-manager repository.
+
This will be used to sign off commits as your work.
 
 
We use the ExtJS framework for the Gui Components, its API documentation can be found [http://docs.sencha.com/extjs/6.0.1/index.html here.]
 
  
=== Using git ===
 
 
It is recommended to start a feature branch before working on the code locally:
 
It is recommended to start a feature branch before working on the code locally:
  
Line 58: Line 83:
 
</source>
 
</source>
  
Then, make your commit (try to make small commits) and include a sign-off line (-s).
+
==== Commits and Commit Messages ====
* Make sure the first line of the commit is ''not longer than 70 characters''.
+
 
* In the rest of the message, limit the line length to 80 characters.
+
Then, make your commit (try to make small, but self-contained, commits) and include a sign-off line (-s).
* If it fixes a bug start with that information in this form: <tt>Fix #1234: summary here</tt>
+
 
* If it implements a feature tracked on bugzilla use: <tt>Close #1234: summary here</tt>
+
* Make sure the line length of the commit's message is '''not longer than 70 characters''', HTTPS links are an exception and should not be splitted.
 +
* If it fixes a bug '''start''' with that information in this form: <code>fix #1234: summary here</code>
 +
* If it implements a feature tracked on bugzilla use: <code>close #1234: summary here</code> albeit <code>fix #1234:</code> is commonly used and also fine
 +
* Try to add a tag at start, if an obvious choice exists. E.g., if you changed the QEMU UI component in pve-manager, a possible tag could be <code>ui: qemu: summary here</code>
 +
: But, do '''not''' just paste the affected files including path and file ending as tag, that has no use and makes it harder to read
 +
 
 +
The following command will take all changes of tracked files and add it to the commit:
 +
 
 
<source lang="bash">
 
<source lang="bash">
 
# git commit -s -a
 
# git commit -s -a
 +
</source>
 +
 +
New files won't get added automatically. To do that, or just add some of the changed files to a commit, use
 +
<source lang="bash">
 +
# git add newfile1.pl file2.pl
 +
</source>
 +
 +
You can always look at what will get into commit with:
 +
<source lang="bash">
 +
# git diff --staged
 
</source>
 
</source>
  
 
== Preparing Patches ==
 
== Preparing Patches ==
 +
 +
{{note| Note that we need a valid [[#Software License and Copyright|CLA]] to include your changes|reminder}}
  
 
Since we have several projects in our git repository and only one development
 
Since we have several projects in our git repository and only one development
Line 88: Line 132:
 
Sending patches:
 
Sending patches:
 
<source lang="bash">
 
<source lang="bash">
# git send-email --to=pve-devel@pve.proxmox.com  my-patches/00*.patch
+
# git send-email --to=pve-devel@lists.proxmox.com  my-patches/00*.patch
 
# rm -rf my-patches/      # to clean left-overs
 
# rm -rf my-patches/      # to clean left-overs
 
</source>
 
</source>
  
 
If you wish to write comments for individual patches, you can do that either in
 
If you wish to write comments for individual patches, you can do that either in
the cover-leter, or in the patch's ''commit summary section'' (between the line
+
the cover-letter, or in the patch's ''commit summary section'' (between the line
 
consisting of 3 consecutive dashes ending your commit message and before the
 
consisting of 3 consecutive dashes ending your commit message and before the
 
list of files with their change-counts.
 
list of files with their change-counts.
Line 100: Line 144:
 
<pre>
 
<pre>
 
From 12345abcde Mon Sep 12 00:00:00 2001
 
From 12345abcde Mon Sep 12 00:00:00 2001
From: Git Commiter <some email address>
+
From: Git Committer <some email address>
 
Date: Fri, 7 Oct 2016 08:30:17 +0200
 
Date: Fri, 7 Oct 2016 08:30:17 +0200
 
Subject: [PATCH container 1/2] Fix #1013: this and that
 
Subject: [PATCH container 1/2] Fix #1013: this and that
  
 
Here is your commit message.
 
Here is your commit message.
It explains the bugfix and ends after thisline.
+
It explains the bugfix and ends after this line.
  
 +
Signed-off-by: Firstname Lastname <firstname@lastname.email>
 
---
 
---
 
  ***HERE*** you can write your comments.
 
  ***HERE*** you can write your comments.
Line 116: Line 161:
 
(...)
 
(...)
 
</pre>
 
</pre>
 +
 +
If you want to send several related patches for one feature but different repositories, you can first iterate over all involved repositories, save the patches into one directory and then do a single git send-email over all generated patches. For example, lets go to a few repos and format the most recent commit as patch to /tmp/patchq, then send it:
 +
 +
<source lang="bash">
 +
# cd pve-manager; git format-patch -s -o /tmp/patchq -1
 +
# cd ../pve-guest-common; git format-patch -s -o /tmp/patchq -1
 +
# cd ../pve-docs; git format-patch -s -o /tmp/patchq -1
 +
# git send-email --compose --to=pve-devel@lists.proxmox.com /tmp/patchq/*
 +
</source>
 +
 +
Using "start-number" and the like can improve this further, but it's a good start.
  
 
=== Versioned Patches ===
 
=== Versioned Patches ===
  
If an updated versioned of your patch series is called for, it should be sent
+
If an updated version of your patch series is called for, it should be sent
as a new series rather than as reply to the old series. (For trivial/short
+
as a new series rather than as reply to the old series.
single patches either way is fine.) Please mark your versions in your subject
+
Always send the whole series with all patches showing the same version.
prefix with a smal 'v' followed by the version number like this:
+
Please mark your versions in your subject prefix with a small 'v' followed by
 +
the version number like this:
  
 
<source lang="bash">
 
<source lang="bash">
Line 130: Line 187:
 
Please list all the changes to the previous versions in the ''commit summary
 
Please list all the changes to the previous versions in the ''commit summary
 
section'' as shown in the above example.
 
section'' as shown in the above example.
 +
For patches with no changes to the previous version, you should mention that there were no
 +
changes in the summary section.
  
 
If your series has a cover letter, also summarize all changes in it as well.
 
If your series has a cover letter, also summarize all changes in it as well.
Line 145: Line 204:
  
 
For convenience you can store the pve-devel email address and the repository's
 
For convenience you can store the pve-devel email address and the repository's
default subject prefices in your repository clones' configurations as follows:
+
default subject prefixes in your repository clones' configurations as follows:
  
 
<source lang="bash">
 
<source lang="bash">
# git config --local sendemail.to pve-devel@pve.proxmox.com
+
$ git config --local sendemail.to pve-devel@lists.proxmox.com
# git config --local format.subjectprefix 'PATCH container'
+
$ git config --local format.subjectprefix 'PATCH container'
 +
$ git config --local format.signoff true
 
</source>
 
</source>
  
Line 158: Line 218:
 
</source>
 
</source>
  
== Proxmox VE 2.0 API Clients ==
+
== Sending Patches ==
  
php : https://github.com/CpuID/pve2-api-php-client
+
Always use <code>git send-email</code> to sent out patches, else the indentation and formatting will get mangled and the patch cannot be applied anymore.
  
perl : http://search.cpan.org/~djzort/Net-Proxmox-VE-0.006/
+
=== Tutorial ===
  
python: https://github.com/remofritzsche/proxmox-utils
+
See https://git-send-email.io/ for an interactive tutorial to setup <code>git send-email</code>.
  
python: https://github.com/Daemonthread/pyproxmox
+
=== Using Authenticated SMTP Server ===
  
java: https://github.com/Elbandi/pve2-api-java
+
Git send mail can be instructed to use a specific SMTP server for sending, the following shows an anonymized config section example:
  
nodejs: https://www.npmjs.org/package/proxmox
+
[sendemail]
 +
        smtpencryption=tls
 +
        smtpserver=webmail.example.com
 +
        smtpserverport=587
 +
        smtpuser=j.smith@example.com
 +
        smtpsslcertpath=
 +
        confirm = always
 +
 
 +
Add this to your global user <code>~/.gitconfig</code> or to the or to the per project <code>.git/config</code>.
 +
<code>git send-email</code> will then use these settings by default and ask you for the password once on sending.
 +
 
 +
=== Example ===
 +
 
 +
To send the last two commits for a Proxmox VE project to the Proxmox VE development list you could then execute:
 +
 
 +
  git send-email --to="pve-devel@lists.proxmox.com" -2
 +
 
 +
If you're not used to <code>git send-email</code> it can be a good test to first send the patches to a email address of yourself, that allows to ensure all details and commands are correct.
  
 
== Bugtracker (bugzilla) ==
 
== Bugtracker (bugzilla) ==
Line 178: Line 255:
 
We only include code licensed under GNU Affero General Public License, version 3 http://www.gnu.org/licenses/agpl-3.0.html.
 
We only include code licensed under GNU Affero General Public License, version 3 http://www.gnu.org/licenses/agpl-3.0.html.
  
Additionally we ask contributors to send us a contributor license agreement form by email. This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to be better stewards of these projects.
+
Additionally, we require that contributors send us a contributor license agreement form by email to <code>office@proxmox.com</code>.
 +
This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to be better stewards of these projects.
  
With the contributor agreement chosen by Proxmox, the [http://www.harmonyagreements.org Harmony CLA], the contributor gives Proxmox a license to use their contributions. The contributor continues to own the copyright in the contribution, with full rights to re-use, re-distribute, and continue modifying the contributed code, allowing them to also share that contribution with other projects.
+
With the contributor agreement chosen by Proxmox, the [http://www.harmonyagreements.org Harmony CLA], the contributor gives Proxmox a license to use their contributions.
 +
The contributor continues to own the copyright in the contribution, with full rights to re-use, re-distribute, and continue modifying the contributed code, allowing them to also share that contribution with other projects.
  
We've tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors, one for [http://www.proxmox.com/downloads/item/proxmox-individual-contributor-license-agreement individual contributors] and one for [http://www.proxmox.com/downloads/item/proxmox-entity-contributor-assignment-agreement entities contributors] (companies, foundations, or other organizations).
+
We've tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors:
 +
* one for [http://www.proxmox.com/downloads/item/proxmox-individual-contributor-license-agreement individual contributors]
 +
* and one for [http://www.proxmox.com/downloads/item/proxmox-entity-contributor-assignment-agreement entities contributors] (companies, foundations, or other organizations).
  
 
If you are making a contribution that is not your work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.
 
If you are making a contribution that is not your work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.
Line 189: Line 270:
 
* [https://git-scm.com/documentation Git Documentation]
 
* [https://git-scm.com/documentation Git Documentation]
 
* [[Perl Style Guide|Our Perl Style Guide]]
 
* [[Perl Style Guide|Our Perl Style Guide]]
 +
* [[Javascript Style Guide|Our JavaScript Style Guide]]
 +
  
 
[[Category: HOWTO]]
 
[[Category: HOWTO]]

Latest revision as of 09:12, 13 September 2021

Introduction

Please coordinate your efforts with us before starting any development. It is important to have a common view of the problem and the corresponding solution – just to avoid duplicated or unnecessary efforts.

We will only include software which matches our quality criteria. The source code repository is read only. To include some code, send it as patch (git diff) to the pve-devel mailing list. We will review your code and commit after a successful review (and possible corrections/additions).

Mailing List

This is the primary communication channel for developers, discussing new features and implementation details. If you are a developer and you want to develop additional features, this is the place to start.

PVE Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Archive: https://lists.proxmox.com/pipermail/pve-devel/

Access to Code Repository (git)

https://git.proxmox.com

Build instructions

You could find build instructions here :

https://git.proxmox.com/?p=pve-common.git;a=blob_plain;f=README.dev;hb=HEAD

Development Package Repository

Some packages required for development can only be found in the devel repository. This is a cross project repository and may be used for all Proxmox Projects.

Add the following to the /etc/apt/sources.list file:

For Proxmox VE 7.x based on Debian 11 Bullseye

 deb http://download.proxmox.com/debian/devel/ bullseye main

For Proxmox VE 6.x based on Debian 10 Buster

 deb http://download.proxmox.com/debian/devel/ buster main

Checking out a git repository

To clone a repository run 'git clone' with the repository name prefixed with the common URL: git://git.proxmox.com/git/

# git clone git://git.proxmox.com/git/pve-manager.git

To update an already cloned project to the current version use:

# git pull

Working on the code

Coding guidelines

The codebase mostly contains perl code, with javascript for the user interface, and C for the Proxmox Cluster Filesystem. For Perl we recommend to have a look at our perl style guide.

For JavaScript we use eslint to check code standards, note that not all repositories got switched over to eslint yet, pve-manager still emits errors and warnings. Check out Javascript Style Guide

We use the ExtJS framework for the Gui Components, its API documentation can be found here.

Using git

If you are not familiar with git it could be worth to take a look at this interactive tutorial: https://try.github.io and read a brief introduction chapter from the official git documentation: https://git-scm.com/docs/gittutorial to gain basic knowledge on it.

First, configure your real name and email address for git, if not done already:

$ git config --global user.name "John Doe"
$ git config --global user.email john@example.com

This will be used to sign off commits as your work.

It is recommended to start a feature branch before working on the code locally:

# git checkout -f -b my_branch master

After this you can start working on your improvements. You'll be able to compare your changes to the current PVE master branch easily with

# git diff master..my_branch

Commits and Commit Messages

Then, make your commit (try to make small, but self-contained, commits) and include a sign-off line (-s).

  • Make sure the line length of the commit's message is not longer than 70 characters, HTTPS links are an exception and should not be splitted.
  • If it fixes a bug start with that information in this form: fix #1234: summary here
  • If it implements a feature tracked on bugzilla use: close #1234: summary here albeit fix #1234: is commonly used and also fine
  • Try to add a tag at start, if an obvious choice exists. E.g., if you changed the QEMU UI component in pve-manager, a possible tag could be ui: qemu: summary here
But, do not just paste the affected files including path and file ending as tag, that has no use and makes it harder to read

The following command will take all changes of tracked files and add it to the commit:

# git commit -s -a

New files won't get added automatically. To do that, or just add some of the changed files to a commit, use

# git add newfile1.pl file2.pl

You can always look at what will get into commit with:

# git diff --staged

Preparing Patches

Yellowpin.svg Note: Note that we need a valid CLA to include your changes

Since we have several projects in our git repository and only one development mailing list, we ask you to clarify which repository your patches are meant for by specifying it in the subject prefix. Since some names are long it's fine if you shorten them (eg. remove the 'pve-' prefix).

Creating the raw patch series, for instance for the pve-container package:

# rm -rf my-patches/       # to clean left-overs
# git format-patch -o my-patches/ --subject-prefix="PATCH container" master..my_branch --cover-letter

Explain in the cover letter the aim of your patches:

edit my-patches/0000-cover-letter.patch

Sending patches:

# git send-email --to=pve-devel@lists.proxmox.com  my-patches/00*.patch
# rm -rf my-patches/       # to clean left-overs

If you wish to write comments for individual patches, you can do that either in the cover-letter, or in the patch's commit summary section (between the line consisting of 3 consecutive dashes ending your commit message and before the list of files with their change-counts.

Example:

From 12345abcde Mon Sep 12 00:00:00 2001
From: Git Committer <some email address>
Date: Fri, 7 Oct 2016 08:30:17 +0200
Subject: [PATCH container 1/2] Fix #1013: this and that

Here is your commit message.
It explains the bugfix and ends after this line.

Signed-off-by: Firstname Lastname <firstname@lastname.email>
---
 ***HERE*** you can write your comments.
 If this is a new version of an old patch, explain your changes here

 src/PVE/Tools.pm | 2 +-

diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm
(...)

If you want to send several related patches for one feature but different repositories, you can first iterate over all involved repositories, save the patches into one directory and then do a single git send-email over all generated patches. For example, lets go to a few repos and format the most recent commit as patch to /tmp/patchq, then send it:

# cd pve-manager; git format-patch -s -o /tmp/patchq -1 
# cd ../pve-guest-common; git format-patch -s -o /tmp/patchq -1 
# cd ../pve-docs; git format-patch -s -o /tmp/patchq -1 
# git send-email --compose --to=pve-devel@lists.proxmox.com /tmp/patchq/*

Using "start-number" and the like can improve this further, but it's a good start.

Versioned Patches

If an updated version of your patch series is called for, it should be sent as a new series rather than as reply to the old series. Always send the whole series with all patches showing the same version. Please mark your versions in your subject prefix with a small 'v' followed by the version number like this:

# git format-patch -o my-patches/ --subject-prefix="PATCH v2 container" master..my_branch

Please list all the changes to the previous versions in the commit summary section as shown in the above example. For patches with no changes to the previous version, you should mention that there were no changes in the summary section.

If your series has a cover letter, also summarize all changes in it as well.

Reviewing patches

After reviewing patches which affect a subsystem you maintain, you can notify with

Acked-by: name / email address

committers that you reviewed the patch and are OK with the changes.

Convenience Settings

For convenience you can store the pve-devel email address and the repository's default subject prefixes in your repository clones' configurations as follows:

$ git config --local sendemail.to pve-devel@lists.proxmox.com
$ git config --local format.subjectprefix 'PATCH container'
$ git config --local format.signoff true

Now the commands to create and send patches become:

# git format-patch -o my-patches/ master..my_branch
# git send-email --compose my-patches/00*.patch

Sending Patches

Always use git send-email to sent out patches, else the indentation and formatting will get mangled and the patch cannot be applied anymore.

Tutorial

See https://git-send-email.io/ for an interactive tutorial to setup git send-email.

Using Authenticated SMTP Server

Git send mail can be instructed to use a specific SMTP server for sending, the following shows an anonymized config section example:

[sendemail]
        smtpencryption=tls
        smtpserver=webmail.example.com
        smtpserverport=587
        smtpuser=j.smith@example.com
        smtpsslcertpath=
        confirm = always

Add this to your global user ~/.gitconfig or to the or to the per project .git/config. git send-email will then use these settings by default and ask you for the password once on sending.

Example

To send the last two commits for a Proxmox VE project to the Proxmox VE development list you could then execute:

 git send-email --to="pve-devel@lists.proxmox.com" -2

If you're not used to git send-email it can be a good test to first send the patches to a email address of yourself, that allows to ensure all details and commands are correct.

Bugtracker (bugzilla)

https://bugzilla.proxmox.com

Software License and Copyright

We only include code licensed under GNU Affero General Public License, version 3 http://www.gnu.org/licenses/agpl-3.0.html.

Additionally, we require that contributors send us a contributor license agreement form by email to office@proxmox.com. This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to be better stewards of these projects.

With the contributor agreement chosen by Proxmox, the Harmony CLA, the contributor gives Proxmox a license to use their contributions. The contributor continues to own the copyright in the contribution, with full rights to re-use, re-distribute, and continue modifying the contributed code, allowing them to also share that contribution with other projects.

We've tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors:

If you are making a contribution that is not your work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.

See Also