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 # fixme: return format!
188 __PACKAGE__-
>register_method ({
193 check
=> ['perm', '/access', ['Sys.Audit']],
195 description
=> "Get group configuration.",
197 additionalProperties
=> 0,
199 poolid
=> {type
=> 'string', format
=> 'pve-poolid' },
206 additionalProperties
=> 0,
208 type
=> { type
=> 'string', enum
=> ['vm', 'storage'] },
209 id
=> { type
=> 'string' },
210 vmid
=> { type
=> 'integer', optional
=> 1 },
211 storage
=> { type
=> 'string', optional
=> 1 },
218 my $usercfg = cfs_read_file
("user.cfg");
220 my $pool = $param->{poolid
};
222 my $data = $usercfg->{pools
}->{$pool};
224 die "pool '$pool' does not exist\n"
229 foreach my $vmid (keys %{$data->{vms
}}) {
237 foreach my $storage (keys %{$data->{storage
}}) {
239 id
=> "storage/$storage",
249 __PACKAGE__-
>register_method ({
250 name
=> 'delete_pool',
255 check
=> ['perm', '/access', ['Sys.Modify']],
257 description
=> "Delete group.",
259 additionalProperties
=> 0,
261 poolid
=> { type
=> 'string', format
=> 'pve-poolid' },
264 returns
=> { type
=> 'null' },
268 PVE
::AccessControl
::lock_user_config
(
271 my $usercfg = cfs_read_file
("user.cfg");
273 my $pool = $param->{poolid
};
275 my $data = $usercfg->{pools
}->{$pool};
277 die "pool '$pool' does not exist\n"
280 delete ($usercfg->{pools
}->{$pool});
282 PVE
::AccessControl
::delete_pool_acl
($pool, $usercfg);
284 cfs_write_file
("user.cfg", $usercfg);
285 }, "delete pool failed");