]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/Network.pm
1 package PVE
::API2
::Network
::Network
;
7 use PVE
::Tools
qw(extract_param);
8 use PVE
::Cluster
qw(cfs_read_file cfs_write_file);
9 use PVE
::Network
::Network
;
10 use PVE
::Network
::Network
::Plugin
;
11 use PVE
::Network
::Network
::VlanPlugin
;
12 use PVE
::Network
::Network
::VxlanMulticastPlugin
;
13 use PVE
::Network
::Network
::VnetPlugin
;
14 use Storable
qw(dclone);
15 use PVE
::JSONSchema
qw(get_standard_option);
16 use PVE
::RPCEnvironment
;
20 use base
qw(PVE::RESTHandler);
22 my $network_type_enum = PVE
::Network
::Network
::Plugin-
>lookup_types();
24 my $api_network_config = sub {
25 my ($cfg, $networkid) = @_;
27 my $scfg = dclone
(PVE
::Network
::Network
::network_config
($cfg, $networkid));
28 $scfg->{network
} = $networkid;
29 $scfg->{digest
} = $cfg->{digest
};
34 __PACKAGE__-
>register_method ({
38 description
=> "Network index.",
40 description
=> "Only list entries where you have 'Network.Audit' or 'Network.Allocate' permissions on '/cluster/network/<network>'",
44 additionalProperties
=> 0,
47 description
=> "Only list network of specific type",
49 enum
=> $network_type_enum,
58 properties
=> { network
=> { type
=> 'string'} },
60 links
=> [ { rel
=> 'child', href
=> "{network}" } ],
65 my $rpcenv = PVE
::RPCEnvironment
::get
();
66 my $authuser = $rpcenv->get_user();
69 my $cfg = PVE
::Network
::Network
::config
();
71 my @sids = PVE
::Network
::Network
::networks_ids
($cfg);
73 foreach my $networkid (@sids) {
74 # my $privs = [ 'Network.Audit', 'Network.Allocate' ];
75 # next if !$rpcenv->check_any($authuser, "/cluster/network/$networkid", $privs, 1);
77 my $scfg = &$api_network_config($cfg, $networkid);
78 next if $param->{type
} && $param->{type
} ne $scfg->{type
};
85 __PACKAGE__-
>register_method ({
89 description
=> "Read network configuration.",
91 # check => ['perm', '/cluster/network/{network}', ['Network.Allocate']],
95 additionalProperties
=> 0,
97 network
=> get_standard_option
('pve-network-id'),
100 returns
=> { type
=> 'object' },
104 my $cfg = PVE
::Network
::Network
::config
();
106 return &$api_network_config($cfg, $param->{network
});
109 __PACKAGE__-
>register_method ({
114 description
=> "Create a new network object.",
116 # check => ['perm', '/cluster/network', ['Network.Allocate']],
118 parameters
=> PVE
::Network
::Network
::Plugin-
>createSchema(),
119 returns
=> { type
=> 'null' },
123 my $type = extract_param
($param, 'type');
124 my $networkid = extract_param
($param, 'network');
126 my $plugin = PVE
::Network
::Network
::Plugin-
>lookup($type);
127 my $opts = $plugin->check_config($networkid, $param, 1, 1);
129 PVE
::Network
::Network
::lock_network_config
(
132 my $cfg = PVE
::Network
::Network
::config
();
135 if ($scfg = PVE
::Network
::Network
::network_config
($cfg, $networkid, 1)) {
136 die "network object ID '$networkid' already defined\n";
139 $cfg->{ids
}->{$networkid} = $opts;
140 $plugin->on_update_hook($networkid, $cfg);
141 #also verify transport associated to vnet
142 if($scfg->{type
} eq 'vnet') {
143 my $transportid = $scfg->{transportzone
};
144 die "missing transportzone" if !$transportid;
145 my $transport_cfg = $cfg->{ids
}->{$transportid};
146 my $transport_plugin = PVE
::Network
::Network
::Plugin-
>lookup($transport_cfg->{type
});
147 $transport_plugin->on_update_hook($transportid, $cfg);
150 PVE
::Network
::Network
::write_config
($cfg);
152 }, "create network object failed");
157 __PACKAGE__-
>register_method ({
162 description
=> "Update network object configuration.",
164 # check => ['perm', '/cluster/network', ['Network.Allocate']],
166 parameters
=> PVE
::Network
::Network
::Plugin-
>updateSchema(),
167 returns
=> { type
=> 'null' },
171 my $networkid = extract_param
($param, 'network');
172 my $digest = extract_param
($param, 'digest');
174 PVE
::Network
::Network
::lock_network_config
(
177 my $cfg = PVE
::Network
::Network
::config
();
179 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
181 my $scfg = PVE
::Network
::Network
::network_config
($cfg, $networkid);
183 my $plugin = PVE
::Network
::Network
::Plugin-
>lookup($scfg->{type
});
184 my $opts = $plugin->check_config($networkid, $param, 0, 1);
186 foreach my $k (%$opts) {
187 $scfg->{$k} = $opts->{$k};
190 $plugin->on_update_hook($networkid, $cfg);
191 #also verify transport associated to vnet
192 if($scfg->{type
} eq 'vnet') {
193 my $transportid = $scfg->{transportzone
};
194 die "missing transportzone" if !$transportid;
195 my $transport_cfg = $cfg->{ids
}->{$transportid};
196 my $transport_plugin = PVE
::Network
::Network
::Plugin-
>lookup($transport_cfg->{type
});
197 $transport_plugin->on_update_hook($transportid, $cfg);
199 PVE
::Network
::Network
::write_config
($cfg);
201 }, "update network object failed");
206 __PACKAGE__-
>register_method ({
209 path
=> '{network}', # /cluster/network/{network}
211 description
=> "Delete network object configuration.",
213 # check => ['perm', '/cluster/network', ['Network.Allocate']],
216 additionalProperties
=> 0,
218 network
=> get_standard_option
('pve-network-id', {
219 completion
=> \
&PVE
::Network
::Network
::complete_network
,
223 returns
=> { type
=> 'null' },
227 my $networkid = extract_param
($param, 'network');
229 PVE
::Network
::Network
::lock_network_config
(
232 my $cfg = PVE
::Network
::Network
::config
();
234 my $scfg = PVE
::Network
::Network
::network_config
($cfg, $networkid);
236 my $plugin = PVE
::Network
::Network
::Plugin-
>lookup($scfg->{type
});
237 $plugin->on_delete_hook($networkid, $cfg);
239 delete $cfg->{ids
}->{$networkid};
240 PVE
::Network
::Network
::write_config
($cfg);
242 }, "delete network object failed");