For now, IP pool is the only resource we have. Signed-off-by: Dietmar Maurer <diet...@proxmox.com> --- data/PVE/Cluster.pm | 1 + data/PVE/Makefile.am | 5 +++- data/PVE/Resource.pm | 18 +++++++++++++++ data/PVE/Resource/IPPool.pm | 49 +++++++++++++++++++++++++++++++++++++++ data/PVE/Resource/Plugin.pm | 54 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 data/PVE/Resource.pm create mode 100755 data/PVE/Resource/IPPool.pm create mode 100755 data/PVE/Resource/Plugin.pm
diff --git a/data/PVE/Cluster.pm b/data/PVE/Cluster.pm index 5ccd07f..eed090d 100644 --- a/data/PVE/Cluster.pm +++ b/data/PVE/Cluster.pm @@ -58,6 +58,7 @@ my $observed = { 'vzdump.cron' => 1, 'storage.cfg' => 1, 'datacenter.cfg' => 1, + 'resource.cfg' => 1, 'cluster.conf' => 1, 'cluster.conf.new' => 1, 'user.cfg' => 1, diff --git a/data/PVE/Makefile.am b/data/PVE/Makefile.am index 7635a78..e0e0aa1 100644 --- a/data/PVE/Makefile.am +++ b/data/PVE/Makefile.am @@ -34,9 +34,12 @@ man5_MANS = datacenter.cfg.5.gz IPCC_so_SOURCES = IPCC.c ppport.h -pvelib_DATA = IPCC.pm Cluster.pm +pvelib_DATA = IPCC.pm Cluster.pm Resource.pm Resource/Plugin.pm pvelibdir = /usr/share/perl5/PVE +pvereslib_DATA = Resource/Plugin.pm Resource/IPPool.pm +pvereslibdir = /usr/share/perl5/PVE/Resource + install-exec-hook: perl -I.. ./pvecm verifyapi diff --git a/data/PVE/Resource.pm b/data/PVE/Resource.pm new file mode 100644 index 0000000..5acc37a --- /dev/null +++ b/data/PVE/Resource.pm @@ -0,0 +1,18 @@ +package PVE::Resource; + +use strict; +use warnings; + +use PVE::Resource::Plugin; +use PVE::Resource::IPPool; + +# code to read/write /etc/pve/resource.cfg +PVE::Resource::IPPool->register(); +PVE::Resource::Plugin->init(); + +# resource related function follow + +# pve_allocate_ip($vmid, $ippool, $ip); +# pve_free_ip($vmid, $ippool, $ip); + +1; diff --git a/data/PVE/Resource/IPPool.pm b/data/PVE/Resource/IPPool.pm new file mode 100755 index 0000000..16c14d8 --- /dev/null +++ b/data/PVE/Resource/IPPool.pm @@ -0,0 +1,49 @@ +package PVE::Resource::IPPool; + +use strict; +use warnings; +use PVE::JSONSchema; +use PVE::Resource::Plugin; + +use base qw(PVE::Resource::Plugin); + +PVE::JSONSchema::register_format('iprange', \&pve_verify_iprange); +sub pve_verify_iprange { + my ($iprange, $noerr) = @_; + + if (!Net::IP->new($iprange)) { + return undef if $noerr; + die "value does not look like a valid IP range\n"; + } + return $iprange; +} + +sub type { + return 'ippool'; +} + +sub properties { + return { + iprange => { + description => "IP range (examples: '195.114.80/24', 192.168.2.100 - 192.168.2.150)", + type => 'string', format => 'iprange', + maxLength => 256, + }, + dhcp => { + description => "Enable internal DHCP daemon on specified interface.", + type => 'string', + pattern => 'eth\d+|vmbr\d+|bond\d+', + maxLength => 64, + } + }; +} + +sub options { + return { + iprange => { optional => 0 }, + dhcp => { optional => 1 }, + comment => { optional => 1 }, + }; +} + +1; diff --git a/data/PVE/Resource/Plugin.pm b/data/PVE/Resource/Plugin.pm new file mode 100755 index 0000000..083b8d2 --- /dev/null +++ b/data/PVE/Resource/Plugin.pm @@ -0,0 +1,54 @@ +package PVE::Resource::Plugin; + +use strict; +use warnings; + +use PVE::INotify; +use PVE::SectionConfig; +use PVE::JSONSchema qw(get_standard_option); +use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_lock_file); +use Data::Dumper; + +use base qw(PVE::SectionConfig); + +my $resourceconfigfile = "resource.cfg"; + +cfs_register_file($resourceconfigfile, + sub { __PACKAGE__->parse_config(@_); }, + sub { __PACKAGE__->write_config(@_); }); + +my $defaultData = { + propertyList => { + type => { description => "Resource type." }, + name => { + description => "Resource name.", + type => 'string', format => 'pve-configid', + }, + comment => { + description => "Description.", + type => 'string', + optional => 1, + maxLength => 4096, + }, + }, +}; + +sub parse_section_header { + my ($class, $line) = @_; + + if ($line =~ m/^(\S+):\s*(\S+)\s*$/) { + my ($type, $name) = (lc($1), $2); + my $errmsg = undef; # set if you want to skip whole section + eval { PVE::JSONSchema::pve_verify_configid($name); }; + $errmsg = $@ if $@; + my $config = {}; # to return additional attributes + return ($type, $name, $errmsg, $config); + } + return undef; +} + +sub private { + return $defaultData; +} + +1; -- 1.7.10.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel