From nobody Mon May 6 13:33:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1560862230; cv=none; d=zoho.com; s=zohoarc; b=i4Z80ti+AVBCliTQ+T9jhfKYvkx2rk+T5mIKYYoGmZ9ZuudnwezD3FkFp4InMnZghIC4uvYaLSzt2bzK7zJk5qBAAoUBJlU1dC6eAI+MXNxyOIQ7xDyjltr+KjSpO/V1lAl+WYPTwFu4qR23CkYQx97JlIfF5O1T9O1pNkaxpP8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1560862230; h=Content-Type:Content-Transfer-Encoding:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To:ARC-Authentication-Results; bh=rt6I5Dh/WlbekNXOBRkxeqDphm0LRSqRyHrHccaIGyk=; b=bIdAtEZanBlWIy4YnVcW5/jdlZm8vPZ8LC9HRXlGeD/zqNHHn5IsUTaSNnt4Jf7obLNb1MkaU4NVUCdFiks7a8rDGSOyEvRPWbQLXRO2ZsAKIe/lKbw7VHjR8NII8/Cwu6zYqACwHj7djd3yP7PDQDRVx5KgTgI0nUzhuhfigkg= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1560862230578396.3705819199147; Tue, 18 Jun 2019 05:50:30 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9B3F431628FE; Tue, 18 Jun 2019 12:50:20 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 627CB69A23; Tue, 18 Jun 2019 12:50:15 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E6B8F19726; Tue, 18 Jun 2019 12:50:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x5ICoAFr010936 for ; Tue, 18 Jun 2019 08:50:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id BA98A82EF6; Tue, 18 Jun 2019 12:50:10 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-112-51.ams2.redhat.com [10.36.112.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 66F8C7D984; Tue, 18 Jun 2019 12:50:06 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 18 Jun 2019 13:50:05 +0100 Message-Id: <20190618125005.18772-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [perl PATCH] Add support for virNetworkPortPtr and its APIs X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 18 Jun 2019 12:50:26 +0000 (UTC) Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- Changes | 2 +- lib/Sys/Virt.pm | 1 + lib/Sys/Virt.xs | 179 ++++++++++++++++++++++++++++++++++++ lib/Sys/Virt/Error.pm | 12 +++ lib/Sys/Virt/Network.pm | 39 ++++++++ lib/Sys/Virt/NetworkPort.pm | 177 +++++++++++++++++++++++++++++++++++ t/030-api-coverage.t | 2 +- typemap | 14 +++ 8 files changed, 424 insertions(+), 2 deletions(-) create mode 100644 lib/Sys/Virt/NetworkPort.pm diff --git a/Changes b/Changes index 0fb13d5..e13c3b3 100644 --- a/Changes +++ b/Changes @@ -2,7 +2,7 @@ Revision history for perl module Sys::Virt =20 5.5.0 2019-07-00 =20 - - XXX + - Add support for virNetworkPortPtr object and its APIs =20 5.4.0 2019-06-12 =20 diff --git a/lib/Sys/Virt.pm b/lib/Sys/Virt.pm index b6553aa..2e01fd6 100644 --- a/lib/Sys/Virt.pm +++ b/lib/Sys/Virt.pm @@ -69,6 +69,7 @@ use warnings; use Sys::Virt::Error; use Sys::Virt::Domain; use Sys::Virt::Network; +use Sys::Virt::NetworkPort; use Sys::Virt::StoragePool; use Sys::Virt::StorageVol; use Sys::Virt::NodeDevice; diff --git a/lib/Sys/Virt.xs b/lib/Sys/Virt.xs index 9586be8..ccd5ba0 100644 --- a/lib/Sys/Virt.xs +++ b/lib/Sys/Virt.xs @@ -6828,6 +6828,27 @@ PREINIT: free(leases); =20 =20 +void +list_all_ports(net, flags=3D0) + virNetworkPtr net; + unsigned int flags; + PREINIT: + virNetworkPortPtr *ports; + int i, nport; + SV *portrv; + PPCODE: + if ((nport =3D virNetworkListAllPorts(net, &ports, flags)) < 0) + _croak_error(); + + EXTEND(SP, nport); + for (i =3D 0 ; i < nport ; i++) { + portrv =3D sv_newmortal(); + sv_setref_pv(portrv, "Sys::Virt::NetworkPort", ports[i]); + PUSHs(portrv); + } + free(ports); + + void destroy(net_rv) SV *net_rv; @@ -6852,6 +6873,150 @@ DESTROY(net_rv) } =20 =20 +MODULE =3D Sys::Virt::NetworkPort PACKAGE =3D Sys::Virt::NetworkPort + + +virNetworkPortPtr +_create_xml(net, xml, flags=3D0) + virNetworkPtr net; + const char *xml; + unsigned int flags; + CODE: + if (!(RETVAL =3D virNetworkPortCreateXML(net, xml, flags))) + _croak_error(); + OUTPUT: + RETVAL + + +virNetworkPortPtr +_lookup_by_uuid(net, uuid) + virNetworkPtr net; + const unsigned char *uuid; + CODE: + if (!(RETVAL =3D virNetworkPortLookupByUUID(net, uuid))) + _croak_error(); + OUTPUT: + RETVAL + + +virNetworkPortPtr +_lookup_by_uuid_string(net, uuid) + virNetworkPtr net; + const char *uuid; + CODE: + if (!(RETVAL =3D virNetworkPortLookupByUUIDString(net, uuid))) + _croak_error(); + + OUTPUT: + RETVAL + + +SV * +get_uuid(port) + virNetworkPortPtr port; + PREINIT: + unsigned char rawuuid[VIR_UUID_BUFLEN]; + CODE: + if ((virNetworkPortGetUUID(port, rawuuid)) < 0) + _croak_error(); + + RETVAL =3D newSVpv((char*)rawuuid, sizeof(rawuuid)); + OUTPUT: + RETVAL + + +SV * +get_uuid_string(port) + virNetworkPortPtr port; + PREINIT: + char uuid[VIR_UUID_STRING_BUFLEN]; + CODE: + if ((virNetworkPortGetUUIDString(port, uuid)) < 0) + _croak_error(); + + RETVAL =3D newSVpv(uuid, 0); + OUTPUT: + RETVAL + + +SV * +get_xml_description(port, flags=3D0) + virNetworkPortPtr port; + unsigned int flags; + PREINIT: + char *xml; + CODE: + if (!(xml =3D virNetworkPortGetXMLDesc(port, flags))) + _croak_error(); + + RETVAL =3D newSVpv(xml, 0); + free(xml); + OUTPUT: + RETVAL + + +HV * +get_parameters(port, flags=3D0) + virNetworkPortPtr port; + unsigned int flags; + PREINIT: + virTypedParameterPtr params =3D NULL; + int nparams =3D 0; + CODE: + if (virNetworkPortGetParameters(port, ¶ms, &nparams, flags) < 0)= { + vir_typed_param_safe_free(params, nparams); + _croak_error(); + } + + RETVAL =3D vir_typed_param_to_hv(params, nparams); + vir_typed_param_safe_free(params, nparams); + OUTPUT: + RETVAL + + +void +set_parameters(port, newparams, flags=3D0) + virNetworkPortPtr port; + HV *newparams; + unsigned int flags; + PREINIT: + virTypedParameterPtr params =3D NULL; + int nparams =3D 0; + PPCODE: + if (virNetworkPortGetParameters(port, ¶ms, &nparams, 0) < 0) { + vir_typed_param_safe_free(params, nparams); + _croak_error(); + } + + nparams =3D vir_typed_param_from_hv(newparams, params, nparams); + + if (virNetworkPortSetParameters(port, params, nparams, flags) < 0) + _croak_error(); + vir_typed_param_safe_free(params, nparams); + + +void +delete(port, flags=3D0) + virNetworkPortPtr port; + unsigned int flags; + PPCODE: + if (virNetworkPortDelete(port, flags) < 0) + _croak_error(); + + +void +DESTROY(port_rv) + SV *port_rv; + PREINIT: + virNetworkPortPtr port; + PPCODE: + port =3D (virNetworkPortPtr)SvIV((SV*)SvRV(port_rv)); + if (port) { + virNetworkPortFree(port); + sv_setiv((SV*)SvRV(port_rv), 0); + } + + MODULE =3D Sys::Virt::StoragePool PACKAGE =3D Sys::Virt::StoragePool =20 =20 @@ -9577,6 +9742,17 @@ BOOT: REGISTER_CONSTANT(VIR_NETWORK_EVENT_STOPPED, EVENT_STOPPED); =20 =20 + stash =3D gv_stashpv( "Sys::Virt::NetworkPort", TRUE ); + REGISTER_CONSTANT(VIR_NETWORK_PORT_CREATE_RECLAIM, CREATE_RECLAIM); + + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE, BANDWID= TH_IN_AVERAGE); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_IN_BURST, BANDWIDTH= _IN_BURST); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR, BANDWIDTH= _IN_FLOOR); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK, BANDWIDTH_= IN_PEAK); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE, BANDWI= DTH_OUT_AVERAGE); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST, BANDWIDT= H_OUT_BURST); + REGISTER_CONSTANT_STR(VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK, BANDWIDTH= _OUT_PEAK); + stash =3D gv_stashpv( "Sys::Virt::Interface", TRUE ); REGISTER_CONSTANT(VIR_INTERFACE_XML_INACTIVE, XML_INACTIVE); =20 @@ -9863,4 +10039,7 @@ BOOT: REGISTER_CONSTANT(VIR_ERR_INVALID_DOMAIN_CHECKPOINT, ERR_INVALID_DOM= AIN_CHECKPOINT); REGISTER_CONSTANT(VIR_ERR_NO_DOMAIN_BACKUP, ERR_NO_DOMAIN_BACKUP); REGISTER_CONSTANT(VIR_ERR_NO_DOMAIN_CHECKPOINT, ERR_NO_DOMAIN_CHECKP= OINT); + REGISTER_CONSTANT(VIR_ERR_NO_NETWORK_PORT, ERR_NO_NETWORK_PORT); + REGISTER_CONSTANT(VIR_ERR_INVALID_NETWORK_PORT, ERR_INVALID_NETWORK_= PORT); + REGISTER_CONSTANT(VIR_ERR_NETWORK_PORT_EXIST, ERR_NETWORK_PORT_EXIST= ); } diff --git a/lib/Sys/Virt/Error.pm b/lib/Sys/Virt/Error.pm index d65ceb5..3f48769 100644 --- a/lib/Sys/Virt/Error.pm +++ b/lib/Sys/Virt/Error.pm @@ -844,6 +844,18 @@ Domain checkpoint not found =20 Domain backup job id not found =20 +=3Ditem Sys::Virt::Error::ERR_NO_NETWORK_PORT + +No matching network port + +=3Ditem Sys::Virt::Error::ERR_INVALID_NETWORK_PORT + +Invalid network port object + +=3Ditem Sys::Virt::Error::ERR_NETWORK_PORT_EXIST + +Network port already exists + =3Dback =20 =3Dhead1 AUTHORS diff --git a/lib/Sys/Virt/Network.pm b/lib/Sys/Virt/Network.pm index 415e629..e4b54da 100644 --- a/lib/Sys/Virt/Network.pm +++ b/lib/Sys/Virt/Network.pm @@ -193,6 +193,45 @@ The client ID or DUID =20 =3Dback =20 +=3Ditem @port =3D $net->list_all_ports($flags=3D0) + +List all ports associated with the network. The return array elements +are instances of the C class. + +=3Ditem $port =3D $net->create_port($xml, $flags=3D0) + +Create a new network port from the given C<$xml> description. The C<$flags> +parameter can optionally taken one or more of the network port creation +constants. The returned C<$port> object is an instance of the +C class. + +=3Dcut + +sub create_port { + my $self =3D shift; + my $xml =3D shift; + my $flags =3D shift || 0; + + return Sys::Virt::NetworkPort->_new(net =3D> $self, xml =3D> $xml, fla= gs =3D> $flags); +} + + +=3Ditem $port =3D $net->get_port_by_uuid($uuid); + +Lookup a network port from a raw or printable UUID. +The returned C<$port> object is an instance of the C +class. + +=3Dcut + +sub get_port_by_uuid { + my $self =3D shift; + my $uuid =3D shift; + + return Sys::Virt::NetworkPort->_new(net =3D> $self, uuid =3D> $uuid); +} + + =3Dback =20 =3Dhead1 CONSTANTS diff --git a/lib/Sys/Virt/NetworkPort.pm b/lib/Sys/Virt/NetworkPort.pm new file mode 100644 index 0000000..9e9bf37 --- /dev/null +++ b/lib/Sys/Virt/NetworkPort.pm @@ -0,0 +1,177 @@ +# -*- perl -*- +# +# Copyright (C) 2019 Red Hat +# +# This program is free software; You can redistribute it and/or modify +# it under either: +# +# a) the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any +# later version, +# +# or +# +# b) the "Artistic License" +# +# The file "LICENSE" distributed along with this file provides full +# details of the terms and conditions of the two licenses. + +=3Dpod + +=3Dhead1 NAME + +Sys::Virt::NetworkPort - Represent & manage a libvirt virtual network port + +=3Dhead1 DESCRIPTION + +The C module represents a port in a virtual networ= k. + +=3Dhead1 METHODS + +=3Dover 4 + +=3Dcut + +package Sys::Virt::NetworkPort; + +use strict; +use warnings; + + +sub _new { + my $proto =3D shift; + my $class =3D ref($proto) || $proto; + my %params =3D @_; + + my $net =3D exists $params{network} ? $params{network} : die "network = parameter is required"; + my $self; + if (exists $params{uuid}) { + if (length($params{uuid}) =3D=3D 16) { + $self =3D Sys::Virt::NetworkPort::_lookup_by_uuid($net, $params{uuid= }); + } elsif (length($params{uuid}) =3D=3D 32 || + length($params{uuid}) =3D=3D 36) { + $self =3D Sys::Virt::NetworkPort::_lookup_by_uuid_string($net, $para= ms{uuid}); + } else { + die "UUID must be either 16 unsigned bytes, or 32/36 hex characters l= ong"; + } + } elsif (exists $params{xml}) { + my $flags =3D $params{flags} || 0; + $self =3D Sys::Virt::NetworkPort::_create_xml($net, $params{xml}, $flags= ); + } else { + die "uuid or xml parameters are required"; + } + + bless $self, $class; + + return $self; +} + + +=3Ditem my $uuid =3D $net->get_uuid() + +Returns a 16 byte long string containing the raw globally unique identifier +(UUID) for the network port. + +=3Ditem my $uuid =3D $net->get_uuid_string() + +Returns a printable string representation of the raw UUID, in the format +'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'. + +=3Ditem my $xml =3D $net->get_xml_description() + +Returns an XML document containing a complete description of +the network port's configuration + +=3Ditem $net->delete() + +Delete the network port from the managed network. + +=3Ditem my $params =3D $net->get_parameters($flags=3D0); + +Get tunable parameters associated with the network port. The C<$flags> +parameter is currently unused and defaults to zero. The returned +C<$params> is a hash reference whose keys are one or more of the +following constants: + +=3Dover 4 + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_IN_AVERAGE + +The average inbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_IN_BURST + +The burstable inbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_IN_FLOOR + +The minimum inbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_IN_PEAK + +The peak inbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_OUT_AVERAGE + +The average outbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_OUT_BURST + +The burstable outbound bandwidth + +=3Ditem Sys::Virt::NetworkPort::BANDWIDTH_OUT_PEAK + +The peak outbound bandwidth + +=3Dback + +=3Ditem $net->set_parameters($params, $flags=3D0); + +Set tunable parameters associated with the network port. The C<$flags> +parameter is currently unused and defaults to zero. The C<$params>=20 +parameter is a hash reference whose keys are one or more of the +constants listed for C. + +=3Dback + +=3Dhead2 NETWORK PORT CREATION CONSTANTS + +When creating network ports zero or more of the following +constants may be used + +=3Dover 4 + +=3Ditem Sys::Virt::NetworkPort::CREATE_RECLAIM + +Providing configuration reclaiming a pre-existing network port. + +=3Dback + + +=3Dcut + + +1; + + +=3Dhead1 AUTHORS + +Daniel P. Berrange + +=3Dhead1 COPYRIGHT + +Copyright (C) 2019 Red Hat + +=3Dhead1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of either the GNU General Public License as published +by the Free Software Foundation (either version 2 of the License, or at +your option any later version), or, the Artistic License, as specified +in the Perl README file. + +=3Dhead1 SEE ALSO + +L, L, L, C + +=3Dcut diff --git a/t/030-api-coverage.t b/t/030-api-coverage.t index 15d4a77..0b6592a 100644 --- a/t/030-api-coverage.t +++ b/t/030-api-coverage.t @@ -152,7 +152,7 @@ virNetworkDHCPLeaseFree ); =20 foreach my $func (sort { $a cmp $b } @functions) { - if ($func =3D~ /(GetConnect|Ref|GetDomain)$/ || + if ($func =3D~ /(GetConnect|Ref|GetDomain|GetNetwork)$/ || grep {/$func/ } @blacklist) { ok(1, $func); next; diff --git a/typemap b/typemap index 9784094..b316aa2 100644 --- a/typemap +++ b/typemap @@ -4,6 +4,7 @@ const unsigned char * T_PV virConnectPtr O_OBJECT_connect virDomainPtr O_OBJECT_domain virNetworkPtr O_OBJECT_network +virNetworkPortPtr O_OBJECT_network_port virNWFilterPtr O_OBJECT_nwfilter virNWFilterBindingPtr O_OBJECT_nwfilter_binding virInterfacePtr O_OBJECT_interface @@ -55,6 +56,19 @@ OUTPUT O_OBJECT_network sv_setref_pv( $arg, "Sys::Virt::Network", (void*)$var ); =20 +INPUT +O_OBJECT_network_port + if (sv_isobject($arg) && (SvTYPE(SvRV($arg)) =3D=3D SVt_PVMG)) + $var =3D INT2PTR($type, SvIV((SV*)SvRV( $arg ))); + else { + warn( \"${Package}::$func_name() -- $var is not a blessed SV refer= ence\" ); + XSRETURN_UNDEF; + } + +OUTPUT +O_OBJECT_network_port + sv_setref_pv( $arg, "Sys::Virt::NetworkPort", (void*)$var ); + =20 INPUT O_OBJECT_storagepool --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list