Esempio n. 1
0
// RemoveGuestInterfaces removes the interfaces for a guest
func (ovs *OVS) RemoveGuestInterfaces(h *http.Request, request *rpc.GuestRequest, response *rpc.GuestResponse) error {
	if request.Guest == nil || request.Guest.Nics == nil {
		return errors.New("missing guest with nics")
	}
	for i, nic := range request.Guest.Nics {
		if nic.Name == "" {
			continue
		}

		// Remove TAP interface from OVS
		if err := deleteOVSIface(nic.Network, nic.Name); err != nil {
			return err
		}

		// Remove TAP Interface
		if err := deleteTAPIface(nic.Name); err != nil {
			return err
		}

		request.Guest.Nics[i] = cleanNic(nic)
	}

	response.Guest = request.Guest
	return nil
}
Esempio n. 2
0
// AddGuestInterfaces creates new interfaces for a guest
func (ovs *OVS) AddGuestInterfaces(h *http.Request, request *rpc.GuestRequest, response *rpc.GuestResponse) error {
	if request.Guest == nil || request.Guest.Nics == nil {
		return errors.New("missing guest with nics")
	}
	for i, nic := range request.Guest.Nics {
		if nic.Name != "" {
			continue
		}

		ifaceName, err := ovs.newIfaceName()
		if err != nil {
			return err
		}

		bridge := nic.Network
		if bridge == "" {
			bridge = ovs.bridge
		}

		// Create TAP interface
		if err := createTAPIface(ifaceName); err != nil {
			return err
		}

		// Add TAP interface to OVS
		if err := addOVSIface(bridge, ifaceName, 0); err != nil {
			// Clean up
			_ = deleteTAPIface(ifaceName)
			return err
		}

		// Populate the guest nic with new info
		iface, err := net.InterfaceByName(ifaceName)
		if err != nil {
			log.WithFields(log.Fields{
				"error":     err,
				"ifaceName": ifaceName,
			}).Error("failed to look up interface by name")
			return err
		}
		request.Guest.Nics[i].Name = iface.Name
		request.Guest.Nics[i].Device = iface.Name
		request.Guest.Nics[i].Network = bridge
		request.Guest.Nics[i].Mac = iface.HardwareAddr.String()
	}
	response.Guest = request.Guest
	return nil
}