]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/Transport.pm
1 package PVE
:: API2
:: Network
:: Transport
;
7 use PVE
:: Tools
qw(extract_param) ;
8 use PVE
:: Cluster
qw(cfs_read_file cfs_write_file) ;
9 use PVE
:: Network
:: Transport
;
10 use PVE
:: Network
:: Transport
:: Plugin
;
11 use PVE
:: Network
:: Transport
:: VlanPlugin
;
12 use PVE
:: Network
:: Transport
:: VxlanMulticastPlugin
;
13 use Storable
qw(dclone) ;
14 use PVE
:: JSONSchema
qw(get_standard_option) ;
15 use PVE
:: RPCEnvironment
;
19 use base
qw(PVE::RESTHandler) ;
21 my $transport_type_enum = PVE
:: Network
:: Transport
:: Plugin-
> lookup_types ();
23 my $api_transport_config = sub {
24 my ( $cfg, $transportid ) = @_ ;
26 my $scfg = dclone
( PVE
:: Network
:: Transport
:: transport_config
( $cfg, $transportid ));
27 $scfg ->{ transport
} = $transportid ;
28 $scfg ->{ digest
} = $cfg ->{ digest
};
33 __PACKAGE__-
> register_method ({
37 description
=> "Transport index." ,
39 description
=> "Only list entries where you have 'NetworkTransport.Audit' or 'NetworkTransport.Allocate' permissions on '/cluster/network/transport/<transport>'" ,
43 additionalProperties
=> 0 ,
46 description
=> "Only list transport of specific type" ,
48 enum
=> $transport_type_enum,
57 properties
=> { transport
=> { type
=> 'string' } },
59 links
=> [ { rel
=> 'child' , href
=> "{transport}" } ],
64 my $rpcenv = PVE
:: RPCEnvironment
:: get
();
65 my $authuser = $rpcenv -> get_user ();
68 my $cfg = PVE
:: Network
:: Transport
:: config
();
70 my @sids = PVE
:: Network
:: Transport
:: transports_ids
( $cfg );
72 foreach my $transportid ( @sids ) {
73 # my $privs = [ 'NetworkTransport.Audit', 'NetworkTransport.Allocate' ];
74 # next if !$rpcenv->check_any($authuser, "/cluster/network/transport/$transportid", $privs, 1);
76 my $scfg = & $api_transport_config ( $cfg, $transportid );
77 next if $param ->{ type
} && $param ->{ type
} ne $scfg ->{ type
};
84 __PACKAGE__-
> register_method ({
86 path
=> '{transport}' ,
88 description
=> "Read transport configuration." ,
90 # check => ['perm', '/cluster/network/transport/{transport}', ['NetworkTransport.Allocate']],
94 additionalProperties
=> 0 ,
96 transport
=> get_standard_option
( 'pve-transport-id' ),
99 returns
=> { type
=> 'object' },
103 my $cfg = PVE
:: Network
:: Transport
:: config
();
105 return & $api_transport_config ( $cfg, $param ->{ transport
});
108 __PACKAGE__-
> register_method ({
113 description
=> "Create a new network transport." ,
115 # check => ['perm', '/cluster/network/transport', ['NetworkTransport.Allocate']],
117 parameters
=> PVE
:: Network
:: Transport
:: Plugin-
> createSchema (),
118 returns
=> { type
=> 'null' },
122 my $type = extract_param
( $param, 'type' );
123 my $transportid = extract_param
( $param, 'transport' );
125 my $plugin = PVE
:: Network
:: Transport
:: Plugin-
> lookup ( $type );
126 my $opts = $plugin -> check_config ( $transportid, $param, 1 , 1 );
128 PVE
:: Network
:: Transport
:: lock_transport_config
(
131 my $cfg = PVE
:: Network
:: Transport
:: config
();
133 if ( my $scfg = PVE
:: Network
:: Transport
:: transport_config
( $cfg, $transportid, 1 )) {
134 die "network transport ID ' $transportid ' already defined \n " ;
137 $cfg ->{ ids
}->{ $transportid } = $opts ;
140 #check local configuration of all nodes for conflict
142 PVE
:: Network
:: Transport
:: write_config
( $cfg );
144 }, "create network transport failed" );
149 __PACKAGE__-
> register_method ({
152 path
=> '{transport}' ,
154 description
=> "Update network transport configuration." ,
156 # check => ['perm', '/cluster/network/transport', ['NetworkTransport.Allocate']],
158 parameters
=> PVE
:: Network
:: Transport
:: Plugin-
> updateSchema (),
159 returns
=> { type
=> 'null' },
163 my $transportid = extract_param
( $param, 'transport' );
164 my $digest = extract_param
( $param, 'digest' );
166 PVE
:: Network
:: Transport
:: lock_transport_config
(
169 my $cfg = PVE
:: Network
:: Transport
:: config
();
171 PVE
:: SectionConfig
:: assert_if_modified
( $cfg, $digest );
173 my $scfg = PVE
:: Network
:: Transport
:: transport_config
( $cfg, $transportid );
175 my $plugin = PVE
:: Network
:: Transport
:: Plugin-
> lookup ( $scfg ->{ type
});
176 my $opts = $plugin -> check_config ( $transportid, $param, 0 , 1 );
178 foreach my $k ( %$opts ) {
179 $scfg ->{ $k } = $opts ->{ $k };
182 #add vlan/vxlan check on existingvnets
183 #check local configuration of all nodes for conflict
184 PVE
:: Network
:: Transport
:: write_config
( $cfg );
186 }, "update network transport failed" );
191 __PACKAGE__-
> register_method ({
194 path
=> '{transport}' , # /cluster/network/transport/{transport}
196 description
=> "Delete network transport configuration." ,
198 # check => ['perm', '/cluster/network/transport', ['NetworkTransport.Allocate']],
201 additionalProperties
=> 0 ,
203 transport
=> get_standard_option
( 'pve-transport-id' , {
204 completion
=> \
& PVE
:: Network
:: Transport
:: complete_transport
,
208 returns
=> { type
=> 'null' },
212 my $transportid = extract_param
( $param, 'transport' );
214 PVE
:: Network
:: Transport
:: lock_transport_config
(
217 my $cfg = PVE
:: Network
:: Transport
:: config
();
219 my $scfg = PVE
:: Network
:: Transport
:: transport_config
( $cfg, $transportid );
221 # my $plugin = PVE::Network::Transport::Plugin->lookup($scfg->{type});
222 # $plugin->on_delete_hook($transportid, $scfg);
224 delete $cfg ->{ ids
}->{ $transportid };
226 #check that vnet don't use this transport
227 PVE
:: Network
:: Transport
:: write_config
( $cfg );
229 }, "delete network transport failed" );