2
0
mirror of https://opendev.org/x/pyghmi synced 2026-04-30 13:37:48 +00:00

Add IPv6 configuration for redfish and IPMI

Add basic static configuration hooks
for now.

Change-Id: I754f4cec7127ea9a03bf9101a6a4732eae88d583
This commit is contained in:
Jarrod Johnson
2023-01-13 09:56:25 -05:00
parent 5422e523c2
commit e2b91a240d
2 changed files with 86 additions and 1 deletions

View File

@@ -869,6 +869,48 @@ class Command(object):
self.oem_init()
self._oem.clear_system_configuration()
def set_net6_configuration(self, static_addresses=None, static_gateway=None, channel=None):
if static_addrs is None and static_gateway is None:
return
if channel is None:
channel = self.get_network_channel()
if static_addresses is not None:
i = 0
for va in static_addresses:
if '/' in va:
va, plen = va.split('/', 1)
else:
plen = '64'
plen = int(plen)
vab = bytearray(socket.inet_pton(socket.AF_INET6, va))
cmddata = bytearray([channel, 56, 0, 0x80]) + vab + bytearray([plen, 0])
self.xraw_command(netfn=0xc, command=1, data=cmddata)
if static_gateway is not None:
gwb = bytearray(socket.inet_pton(socket.AF_INET6, static_gateway))
cmddata = bytearray([channel, 65]) + gwb
self.xraw_command(netfn=0xc, command=1, data=cmddata)
def get_net6_configuration(self, channel=None):
if channel is None:
channel = self.get_network_channel()
retdata = {}
ip6a = self.xraw_command(netfn=0xc, command=2, data=(channel, 56, 0, 0))
ip6d = bytearray(ip6a['data'])
if ip6d[0] != 0x11:
raise Exception('Unsupported reply')
if ip6d[2] & 0x80 == 0x80:
ip6b = ip6d[3:19]
ip6addr = socket.inet_ntop(socket.AF_INET6, ip6b)
plen = ip6d[19]
retdata['static_addrs'] = ['{}/{}'.format(ip6addr, plen)]
ip6g = self.xraw_command(netfn=0xc, command=2, data=(channel, 65, 0, 0))
ip6gd = bytearray(ip6g['data'])
if ip6gd[0] != 0x11:
raise Exception('Unsupported reply')
gwa = socket.inet_ntop(socket.AF_INET6, ip6gd[1:17])
retdata['static_gateway'] = gwa
return retdata
def set_net_configuration(self, ipv4_address=None, ipv4_configuration=None,
ipv4_gateway=None, channel=None):
"""Set network configuration data.
@@ -883,6 +925,9 @@ class Command(object):
:param ipv4_gateway: IP address of gateway to use.
:param channel: LAN channel to configure, defaults to autodetect
"""
if (ipv4_address is None and ipv4_configuration is None
and ipv4_gateway is None):
return
if channel is None:
channel = self.get_network_channel()
if ipv4_configuration is not None:

View File

@@ -899,12 +899,37 @@ class Command(object):
parms = {'Action': 'Bios.ResetBios'}
self._do_web_request(rb, parms)
def set_net6_configuration(self, static_addresses=None, static_gateway=None, name=None):
patch = {}
if static_addresses is not None:
sa = []
patch['IPv6StaticAddresses'] = sa
for addr in static_addresses:
if '/' in addr:
addr, plen = addr.split('/', 1)
else:
plen = '64'
sa.append({
'PrefixLength': int(plen),
'Address': addr
})
if static_gateway:
patch['IPv6StaticDefaultGateways'] = [{
'Address': static_gateway,
}]
if patch:
nicurl = self._get_bmc_nic_url(name)
self._do_web_request(nicurl, patch, 'PATCH')
def set_net_configuration(self, ipv4_address=None, ipv4_configuration=None,
ipv4_gateway=None, name=None):
patch = {}
ipinfo = {}
dodhcp = None
netmask = None
if (ipv4_address is None and ipv4_configuration is None
and ipv4_gateway is None):
return
if ipv4_address:
if '/' in ipv4_address:
ipv4_address, cidr = ipv4_address.split('/')
@@ -918,7 +943,7 @@ class Command(object):
patch['IPv4StaticAddresses'] = [ipinfo]
ipinfo['Gateway'] = ipv4_gateway
ipv4_configuration = 'static'
if ipv4_configuration.lower() == 'dhcp':
if ipv4_configuration and ipv4_configuration.lower() == 'dhcp':
dodhcp = True
patch['DHCPv4'] = {'DHCPEnabled': True}
elif (ipv4_configuration == 'static'
@@ -937,6 +962,21 @@ class Command(object):
ipinfo['AddressOrigin'] = 'Static'
self._do_web_request(nicurl, patch, 'PATCH')
def get_net6_configuration(self, name=None):
nicurl = self._get_bmc_nic_url(name)
netcfg = self._do_web_request(nicurl, cache=False)
retdata = {}
saddrs = netcfg.get('IPv6StaticAddresses', ())
retdata['static_addrs'] = []
for sa in saddrs:
ca = '{}/{}'.format(sa['Address'], sa['PrefixLength'])
retdata['static_addrs'].append(ca)
gws = netcfg.get('IPv6StaticDefaultGateways', None)
if gws:
for gw in gws:
retdata['static_gateway'] = gw['Address']
return retdata
def get_net_configuration(self, name=None):
nicurl = self._get_bmc_nic_url(name)
netcfg = self._do_web_request(nicurl, cache=False)