diff --git a/opennebula_api/serializers.py b/opennebula_api/serializers.py index c8878120..fd339e3c 100644 --- a/opennebula_api/serializers.py +++ b/opennebula_api/serializers.py @@ -1,4 +1,5 @@ import oca +import ipaddress from rest_framework import serializers @@ -81,9 +82,7 @@ class VirtualMachineSerializer(serializers.Serializer): disk_size = serializers.SerializerMethodField() - ip = serializers.CharField(read_only=True, - source='user_template.ungleich_public_ip', - default='-') + ip = serializers.SerializerMethodField() vm_id = serializers.IntegerField(read_only=True, source='id') state = serializers.CharField(read_only=True, source='str_state') price = serializers.SerializerMethodField() @@ -147,3 +146,30 @@ class VirtualMachineSerializer(serializers.Serializer): template_id = obj.template.template_id template = OpenNebulaManager().get_template(template_id) return template.name + + def get_ip(self, obj): + nic = obj.template.nics[0] + if is_in_v4_range(nic.mac): + return str(v4_from_mac(nic.mac)) + else: + return '-' + + + +def hexstr2int(string): + return int(string.replace(':', ''), 16) + +FIRST_MAC = hexstr2int('02:00:b3:39:79:4d') +FIRST_V4 = ipaddress.ip_address('185.203.112.2') +COUNT = 1000 + +def v4_from_mac(mac): + """Calculates the IPv4 address from a MAC address. + + mac: string (the colon-separated representation) + returns: ipaddress.ip_address object with the v4 address + """ + return FIRST_V4 + (hexstr2int(mac) - FIRST_MAC) + +def is_in_v4_range(mac): + return FIRST_MAC <= hexstr2int(mac) < FIRST_MAC + 1000