1 package PVE
::API2
::Pool
;
5 use PVE
::Exception
qw(raise_param_exc);
6 use PVE
::Cluster qw
(cfs_read_file cfs_write_file
);
7 use PVE
::AccessControl
;
11 use Data
::Dumper
; # fixme: remove
15 use base
qw(PVE::RESTHandler);
17 my $extract_pool_data = sub {
18 my ($data, $full) = @_;
22 $res->{comment
} = $data->{comment
} if defined($data->{comment
});
24 return $res if !$full;
26 $res->{vms
} = $data->{vms
} ?
[ keys %{$data->{vms
}} ] : [];
28 $res->{storages
} = $data->{storage
} ?
[ keys %{$data->{storage
}} ] : [];
33 __PACKAGE__-
>register_method ({
37 description
=> "Pool index.",
42 additionalProperties
=> 0,
50 poolid
=> { type
=> 'string' },
53 links
=> [ { rel
=> 'child', href
=> "{poolid}" } ],
58 my $rpcenv = PVE
::RPCEnvironment
::get
();
62 my $usercfg = $rpcenv->{user_cfg
};
64 foreach my $poolpath (keys %{$usercfg->{pools
}}) {
65 my $entry = &$extract_pool_data($usercfg->{pools
}->{$poolpath});
66 $entry->{poolid
} = $poolpath;
73 __PACKAGE__-
>register_method ({
74 name
=> 'create_pool',
79 check
=> ['perm', '/access', ['Sys.Modify']],
81 description
=> "Create new pool.",
83 additionalProperties
=> 0,
85 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
86 comment
=> { type
=> 'string', optional
=> 1 },
89 returns
=> { type
=> 'null' },
93 PVE
::AccessControl
::lock_user_config
(
96 my $usercfg = cfs_read_file
("user.cfg");
98 my $pool = $param->{poolid
};
100 die "pool '$pool' already exists\n"
101 if $usercfg->{pools
}->{$pool};
103 $usercfg->{pools
}->{$pool} = { vms
=> {}, storage
=> {} };
105 $usercfg->{pools
}->{$pool}->{comment
} = $param->{comment
} if $param->{comment
};
107 cfs_write_file
("user.cfg", $usercfg);
108 }, "create pool failed");
113 __PACKAGE__-
>register_method ({
114 name
=> 'update_pool',
119 check
=> ['perm', '/access', ['Sys.Modify']],
121 description
=> "Update pool data.",
123 additionalProperties
=> 0,
125 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
126 comment
=> { type
=> 'string', optional
=> 1 },
128 description
=> "List of virtual machines.",
129 type
=> 'string', format
=> 'pve-vmid-list',
133 description
=> "List of storage IDs.",
134 type
=> 'string', format
=> 'pve-storage-id-list',
138 description
=> "Remove vms/storage (instead of adding it).",
144 returns
=> { type
=> 'null' },
148 PVE
::AccessControl
::lock_user_config
(
151 my $usercfg = cfs_read_file
("user.cfg");
153 my $pool = $param->{poolid
};
155 my $data = $usercfg->{pools
}->{$pool};
157 die "pool '$pool' does not exist\n"
160 $data->{comment
} = $param->{comment
} if defined($param->{comment
});
162 if (defined($param->{vms
})) {
163 foreach my $vmid (PVE
::Tools
::split_list
($param->{vms
})) {
164 if ($param->{delete}) {
165 die "VM $vmid is not a pool member\n"
166 if !$data->{vms
}->{$vmid};
167 delete $data->{vms
}->{$vmid};
168 delete $usercfg->{vms
}->{$vmid};
170 die "VM $vmid is already a pool member\n"
171 if $data->{vms
}->{$vmid};
172 die "VM $vmid belongs to pool '$usercfg->{vms}->{$vmid}'\n"
173 if $usercfg->{vms
}->{$vmid};
175 $data->{vms
}->{$vmid} = 1;
176 $usercfg->{vms
}->{$vmid} = 1;
181 if (defined($param->{storage
})) {
182 foreach my $storeid (PVE
::Tools
::split_list
($param->{storage
})) {
183 if ($param->{delete}) {
184 die "Storage '$storeid' is not a pool member\n"
185 if !$data->{storage
}->{$storeid};
186 delete $data->{storage
}->{$storeid};
188 die "Storage '$storeid' is already a pool member\n"
189 if $data->{storage
}->{$storeid};
191 $data->{storage
}->{$storeid} = 1;
196 cfs_write_file
("user.cfg", $usercfg);
197 }, "update pools failed");
202 # fixme: return format!
203 __PACKAGE__-
>register_method ({
208 check
=> ['perm', '/access', ['Sys.Audit']],
210 description
=> "Get group configuration.",
212 additionalProperties
=> 0,
214 poolid
=> {type
=> 'string', format
=> 'pve-poolid' },
221 my $usercfg = cfs_read_file
("user.cfg");
223 my $pool = $param->{poolid
};
225 my $data = $usercfg->{pools
}->{$pool};
227 die "pool '$pool' does not exist\n"
230 return &$extract_pool_data($data, 1);
234 __PACKAGE__-
>register_method ({
235 name
=> 'delete_pool',
240 check
=> ['perm', '/access', ['Sys.Modify']],
242 description
=> "Delete group.",
244 additionalProperties
=> 0,
246 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
249 returns
=> { type
=> 'null' },
253 PVE
::AccessControl
::lock_user_config
(
256 my $usercfg = cfs_read_file
("user.cfg");
258 my $pool = $param->{poolid
};
260 my $data = $usercfg->{pools
}->{$pool};
262 die "pool '$pool' does not exist\n"
265 delete ($usercfg->{pools
}->{$pool});
267 PVE
::AccessControl
::delete_pool_acl
($pool, $usercfg);
269 cfs_write_file
("user.cfg", $usercfg);
270 }, "delete pool failed");