hey. If I create something in loop, and I want to ...
# python
l
hey. If I create something in loop, and I want to use it later how I can handle it? e.g.
for vm in self.vms:
self.vm_ports.append(openstack.networking.Port(f"{vm.name}_port",
network_id=network_id,
fixed_ips=[openstack.networking.PortFixedIpArgs(subnet_id=subnet_id)],
allowed_address_pairs=[{'ip_address': allowed_address}],
tags=[f"{vm.name}_port"]
))
later I create vm and I need port id
for vm in self.vms:
_network_port = next((port.id for port in self.vm_ports if f"{vm.name}_port" in port.tags), None)
How I can refer in one loop to objects that will be created in other loop?
s
Can you create them in the same loop?
l
That's what I finally do. I guess there is no other option
m
Your code is a bit hard to read the way it's formatted. You can add resources to lists (which you already seem to do) and then refer to them later:
Copy code
my_ports = []

for i in range(9):
  port = openstack.networking.Port(...)
  my_ports.append(port)

for n in range(3):
  networks = [openstack.compute.InstanceNetworkArgs(port=port.id) for port in my_ports[3*n:3*n+3]]
  vm = openstack.compute.Instance(..., networks=networks)
The key is to remember that resource output values have to be handled as outputs, not as regular Python variables.