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 __PACKAGE__-
>register_method ({
21 description
=> "Pool index.",
26 additionalProperties
=> 0,
34 poolid
=> { type
=> 'string' },
37 links
=> [ { rel
=> 'child', href
=> "{poolid}" } ],
42 my $rpcenv = PVE
::RPCEnvironment
::get
();
46 my $usercfg = $rpcenv->{user_cfg
};
48 foreach my $pool (keys %{$usercfg->{pools
}}) {
49 my $entry = { poolid
=> $pool };
50 my $data = $usercfg->{pools
}->{$pool};
51 $entry->{comment
} = $data->{comment
} if defined($data->{comment
});
58 __PACKAGE__-
>register_method ({
59 name
=> 'create_pool',
64 check
=> ['perm', '/access', ['Sys.Modify']],
66 description
=> "Create new pool.",
68 additionalProperties
=> 0,
70 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
71 comment
=> { type
=> 'string', optional
=> 1 },
74 returns
=> { type
=> 'null' },
78 PVE
::AccessControl
::lock_user_config
(
81 my $usercfg = cfs_read_file
("user.cfg");
83 my $pool = $param->{poolid
};
85 die "pool '$pool' already exists\n"
86 if $usercfg->{pools
}->{$pool};
88 $usercfg->{pools
}->{$pool} = { vms
=> {}, storage
=> {} };
90 $usercfg->{pools
}->{$pool}->{comment
} = $param->{comment
} if $param->{comment
};
92 cfs_write_file
("user.cfg", $usercfg);
93 }, "create pool failed");
98 __PACKAGE__-
>register_method ({
99 name
=> 'update_pool',
104 check
=> ['perm', '/access', ['Sys.Modify']],
106 description
=> "Update pool data.",
108 additionalProperties
=> 0,
110 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
111 comment
=> { type
=> 'string', optional
=> 1 },
113 description
=> "List of virtual machines.",
114 type
=> 'string', format
=> 'pve-vmid-list',
118 description
=> "List of storage IDs.",
119 type
=> 'string', format
=> 'pve-storage-id-list',
123 description
=> "Remove vms/storage (instead of adding it).",
129 returns
=> { type
=> 'null' },
133 PVE
::AccessControl
::lock_user_config
(
136 my $usercfg = cfs_read_file
("user.cfg");
138 my $pool = $param->{poolid
};
140 my $data = $usercfg->{pools
}->{$pool};
142 die "pool '$pool' does not exist\n"
145 $data->{comment
} = $param->{comment
} if defined($param->{comment
});
147 if (defined($param->{vms
})) {
148 foreach my $vmid (PVE
::Tools
::split_list
($param->{vms
})) {
149 if ($param->{delete}) {
150 die "VM $vmid is not a pool member\n"
151 if !$data->{vms
}->{$vmid};
152 delete $data->{vms
}->{$vmid};
153 delete $usercfg->{vms
}->{$vmid};
155 die "VM $vmid is already a pool member\n"
156 if $data->{vms
}->{$vmid};
157 die "VM $vmid belongs to pool '$usercfg->{vms}->{$vmid}'\n"
158 if $usercfg->{vms
}->{$vmid};
160 $data->{vms
}->{$vmid} = 1;
161 $usercfg->{vms
}->{$vmid} = 1;
166 if (defined($param->{storage
})) {
167 foreach my $storeid (PVE
::Tools
::split_list
($param->{storage
})) {
168 if ($param->{delete}) {
169 die "Storage '$storeid' is not a pool member\n"
170 if !$data->{storage
}->{$storeid};
171 delete $data->{storage
}->{$storeid};
173 die "Storage '$storeid' is already a pool member\n"
174 if $data->{storage
}->{$storeid};
176 $data->{storage
}->{$storeid} = 1;
181 cfs_write_file
("user.cfg", $usercfg);
182 }, "update pools failed");
187 __PACKAGE__-
>register_method ({
192 check
=> ['perm', '/access', ['Sys.Audit']],
194 description
=> "Get group configuration.",
196 additionalProperties
=> 0,
198 poolid
=> {type
=> 'string', format
=> 'pve-poolid' },
203 additionalProperties
=> 0,
205 comment
=> { type
=> 'string', optional
=> 1 },
210 additionalProperties
=> 0,
212 type
=> { type
=> 'string', enum
=> ['vm', 'storage'] },
213 id
=> { type
=> 'string' },
214 vmid
=> { type
=> 'integer', optional
=> 1 },
215 storage
=> { type
=> 'string', optional
=> 1 },
224 my $usercfg = cfs_read_file
("user.cfg");
226 my $pool = $param->{poolid
};
228 my $data = $usercfg->{pools
}->{$pool};
230 die "pool '$pool' does not exist\n"
235 foreach my $vmid (keys %{$data->{vms
}}) {
243 foreach my $storage (keys %{$data->{storage
}}) {
245 id
=> "storage/$storage",
251 my $res = { members
=> $members };
252 $res->{comment
} = $data->{comment
} if defined($data->{comment
});
258 __PACKAGE__-
>register_method ({
259 name
=> 'delete_pool',
264 check
=> ['perm', '/access', ['Sys.Modify']],
266 description
=> "Delete group.",
268 additionalProperties
=> 0,
270 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
273 returns
=> { type
=> 'null' },
277 PVE
::AccessControl
::lock_user_config
(
280 my $usercfg = cfs_read_file
("user.cfg");
282 my $pool = $param->{poolid
};
284 my $data = $usercfg->{pools
}->{$pool};
286 die "pool '$pool' does not exist\n"
289 delete ($usercfg->{pools
}->{$pool});
291 PVE
::AccessControl
::delete_pool_acl
($pool, $usercfg);
293 cfs_write_file
("user.cfg", $usercfg);
294 }, "delete pool failed");