def create_scaled_endpoint(self, ip, backends): """ Creates a scaled endpoint in the network. 1. First create the endpoint object and add it to the set of endpoints 2. Call update_endpoint on all transit switch of the network. """ logger.info("[NETWORK {}]: create_scaled_endpoint {}".format( self.netid, ip)) if ip in self.endpoints: raise ValueError("Endpoint IP {} is already in use.".format(ip)) switches = list(self.transit_switches.values()) self.endpoints[ip] = endpoint(self.vni, self.netid, ip=ip, vpc_cidr=self.vpc_cidr, net_cidr=self.cidr, gw_ip=self.get_gw_ip(), eptype=CONSTANTS.TRAN_SCALED_EP, host=None, backends=backends) # Now update the endpoint on the remaining switches for switch in switches: switch.update_scaled_endpoint(self.endpoints[ip]) # Update the endpoint again with the full switches self.endpoints[ip].update(self) return self.endpoints[ip]
def create_vxlan_endpoint(self, ip, host): """ Creates a vxlan endpoint """ logger.info("[NETWORK {}]: create_vxlan_endpoint {}".format( self.netid, ip)) br = self.get_ovs_bridge_name() if (not host.ovs_is_exist(br)): host.ovs_add_bridge(br) self.endpoints[ip] = endpoint(self.vni, self.netid, ip=ip, vpc_cidr=self.vpc_cidr, net_cidr=self.cidr, gw_ip=self.get_gw_ip(), host=host, tuntype='vxn', bridge=br) # Create a geneve tunnel interface to one of the switches transit_itf = 'vxn_transit' switch = list(self.transit_switches.values())[0] transit_port = host.ovs_create_geneve_tun_itf(br, transit_itf, self.vni, switch.ip) host.ovs_add_transit_flow(br, self.endpoints[ip].bridge_port, transit_port) # We now tell the transit switch about the endpoint for s in self.transit_switches.values(): s.update_endpoint(self.endpoints[ip]) # Create vxlan tunnel interface to all vxlan endpoints for ep_i in self.endpoints.values(): if ep_i.host is None or ep_i.tuntype != 'vxn': continue for ep_j in self.endpoints.values(): if ep_j.host is None: continue if ep_i.host.ip == ep_j.host.ip: continue if ep_j.tuntype == 'vxn': remote_ip = ep_j.host.ip out_port = ep_i.host.ovs_create_vxlan_tun_itf( br, ep_j.tunitf, self.vni, remote_ip) ep_i.host.add_vxlan_ofrule(br, ep_i.bridge_port, out_port, ep_j.ip) return self.endpoints[ip]
def create_simple_endpoint(self, ip, host): """ Creates a simple endpoint in the network. 1. First create the endpoint object and add it to the set of endpoints 2. Call update_endpoint on at least one transit switch of the network (two or three switches may be a good idea in production!). 3. Call update on each endpoint's transit agent within the network. The endpoint becomes ready to send packets. """ logger.info("[NETWORK {}]: create_simple_endpoint {}".format( self.netid, ip)) if ip in self.endpoints: raise ValueError("Endpoint IP {} is already in use.".format(ip)) switches = list(self.transit_switches.values()) # Create a temp network object of only one switch temp_net = network(self.vni, self.netid, self.cidr, self.vpc_cidr) temp_net.transit_switches[switches[0].id] = switches[0] start = time.time() self.endpoints[ip] = endpoint(self.vni, self.netid, ip=ip, vpc_cidr=self.vpc_cidr, net_cidr=self.cidr, gw_ip=self.get_gw_ip(), host=host) switches[0].update_endpoint(self.endpoints[ip]) self.endpoints[ip].update(temp_net) end = time.time() ep_ready_time = end - start logger.info( "[NETWORK {}]: endpoint {} provisioned and ready in {:5.4f} seconds (O(1)!)." .format(self.netid, ip, ep_ready_time)) # Now update the endpoint on the remaining switches for switch in switches[1:]: switch.update_endpoint(self.endpoints[ip]) # Update the endpoint again with the full switches self.endpoints[ip].update(self) return self.endpoints[ip]
def create_host_endpoint(self, ip, host): logger.info("[NETWORK {}]: create_host_endpoint {}".format( self.netid, ip)) self.endpoints[ip] = endpoint(self.vni, self.netid, ip=ip, prefixlen=self.cidr.prefixlen, gw_ip=self.get_gw_ip(), host=host, netip=self.cidr.ip, host_ep="yes") # Now update the endpoint on the remaining switches for switch in self.transit_switches.values(): switch.update_endpoint(self.endpoints[ip]) self.endpoints[ip].update(self)
def create_host_endpoint(self, ip, host): logger.info("[NETWORK {}]: create_host_endpoint {}".format( self.netid, ip)) self.endpoints[ip] = endpoint(self.vni, self.netid, ip=ip, vpc_cidr=self.vpc_cidr, net_cidr=self.cidr, gw_ip=self.get_gw_ip(), host=host, host_ep=True) # Now update the endpoint on the remaining switches for switch in self.transit_switches.values(): switch.update_endpoint(self.endpoints[ip]) self.endpoints[ip].update(self) return self.endpoints[ip]
def create_gw_endpoint(self): """ Allocates the first IP of the network CIDR range and Creates a phantom endpoint (without a host). """ ip = self.get_gw_ip() if ip in self.endpoints: raise ValueError("Endpoint IP {} is already in use.".format(ip)) logger.info("[NETWORK {}]: create_gw_endpoint {}".format( self.netid, ip)) self.endpoints[ip] = endpoint( self.vni, self.netid, ip=ip, prefixlen=self.cidr.prefixlen, gw_ip=None, host=None) # Now update the endpoint on the remaining switches for switch in self.transit_switches.values(): switch.update_endpoint(self.endpoints[ip])