/* Build all translation maps for the given project. Does NOT replace a map with a nil map; we assume this is an openstack glitch. CAUTION: ip2 maps are complete, where vm2 or vmid2 maps are not because they only reference one of the VMs IP addresses where there might be many. */ func (p *osif_project) refresh_maps(creds *ostack.Ostack) (rerr error) { if p == nil { return } if creds == nil { osif_sheep.Baa(1, "IER: refresh_maps given nil creds") rerr = fmt.Errorf("creds were nil") return } if *p.name != "_ref_" { // we don't fetch maps from the ref since it's not real olastfetch := p.lastfetch // last fetch -- ensure it wasn't fetched while we waited p.rwlock.Lock() // wait for a write lock defer p.rwlock.Unlock() // ensure unlocked on return if olastfetch != p.lastfetch { // assume read done while we waited return } osif_sheep.Baa(2, "refresh: creating VM maps from: %s", creds.To_str()) vmid2ip, ip2vmid, vm2ip, vmid2host, vmip2vm, err := creds.Mk_vm_maps(nil, nil, nil, nil, nil, true) if err != nil { osif_sheep.Baa(2, "WRN: unable to map VM info (vm): %s; %s [TGUOSI003]", creds.To_str(), err) rerr = err creds.Expire() // force re-auth next go round } else { osif_sheep.Baa(2, "%s map sizes: vmid2ip=%d ip2vmid=%d vm2ip=%d vmid2host=%d vmip2vm=%d", *p.name, len(vmid2ip), len(ip2vmid), len(vm2ip), len(vmid2host), len(vmip2vm)) if len(vmip2vm) > 0 && len(vmid2ip) > 0 && len(ip2vmid) > 0 && len(vm2ip) > 0 && len(vmid2host) > 0 { // don't refresh unless all are good p.vmid2ip = vmid2ip // id and vm name map to just ONE ip address p.vm2ip = vm2ip p.ip2vmid = ip2vmid // the only complete list of ips p.vmid2host = vmid2host // id to physical host p.ip2vm = vmip2vm } } fip2ip, ip2fip, err := creds.Mk_fip_maps(nil, nil, true) if err != nil { osif_sheep.Baa(2, "WRN: unable to map VM info (fip): %s; %s [TGUOSI004]", creds.To_str(), err) rerr = err creds.Expire() // force re-auth next go round } else { osif_sheep.Baa(2, "%s map sizes: ip2fip=%d fip2ip=%d", *p.name, len(ip2fip), len(fip2ip)) if len(ip2fip) > 0 && len(fip2ip) > 0 { p.ip2fip = ip2fip p.ip2fip = fip2ip } } ip2mac, _, err := creds.Mk_mac_maps(nil, nil, true) if err != nil { osif_sheep.Baa(2, "WRN: unable to map MAC info: %s; %s [TGUOSI005]", creds.To_str(), err) rerr = err creds.Expire() // force re-auth next go round } else { osif_sheep.Baa(2, "%s map sizes: ip2mac=%d", *p.name, len(ip2mac)) if len(ip2mac) > 0 { p.ip2mac = ip2mac } } gwmap, _, gwmac2id, _, _, gwip2phost, err := creds.Mk_gwmaps(nil, nil, nil, nil, nil, nil, true, false) // gwmap is mac2ip if err != nil { osif_sheep.Baa(2, "WRN: unable to map gateway info: %s; %s [TGUOSI006]", creds.To_str(), err) creds.Expire() // force re-auth next go round } else { osif_sheep.Baa(2, "%s map sizes: gwmap=%d", *p.name, len(gwmap)) if len(gwmap) > 0 { p.gwmap = gwmap } for mac, id := range gwmac2id { // run the gateway info and insert as though they were first class VMs ip := gwmap[mac] p.vmid2ip[*id] = ip p.ip2vmid[*ip] = id p.vmid2host[*id] = gwip2phost[*ip] p.vm2ip[*ip] = ip // gw is nameless, so use the ip address } } _, gw2cidr, err := creds.Mk_snlists() // get list of gateways and their subnet cidr if err == nil && gw2cidr != nil { p.gw2cidr = gw2cidr } else { if err != nil { osif_sheep.Baa(1, "WRN: unable to create gateway to cidr map: %s; %s [TGUOSI007]", creds.To_str(), err) } else { osif_sheep.Baa(1, "WRN: unable to create gateway to cidr map: %s no reason given [TGUOSI007]", creds.To_str()) } creds.Expire() // force re-auth next go round } p.lastfetch = time.Now().Unix() } return }